Implementacja architektury multi-tenancy [PHP] + integracja ze sklepem
Posiadam aplikację opartą na pliku config i własnej bazie danych, służącą do kompletowania towaru i sortowania zamówień. Celem jest udostępnienie jej w „sklepie”, gdzie sklep wysyła webhooki, a my instalujemy instancję. Zakres prac:
1) Modyfikacje aplikacji
Tabela tenant(id PK, client_id UNIQUE, api_license, api_url, api_key_enc, created_at).
Dodanie tenant_id (FK) we wszystkich tabelach z danymi + indeksy (tenant_id, …) w krytycznych tabelach.
W kodzie każde zapytanie zawsze filtrować po tenant_id; API używa odszyfrowanego klucza (Middleware ResolveTenant odczytuje token/JWT, ustawia request.tenant_id).
Usunąć statyczny .config; korzystać wyłącznie ze zmiennych środowiskowych:
DB_CONNECTION_STRING
APPLICATION_KEY (z panelu Apps)
DEVELOPER_LOGIN
Klucz API przychodzi zaszyfrowany w webhooku i jest zapisywany w tenant.api_key_enc.
2) Integracja ze sklepem
Instalacja: po zakupie aplikacji sklep wyśle webhook POST z:
client_id (ID sklepu)
application_id
api_license
(online) api_key i auth_type (key lub OAuth)
→ traktujemy jako żądanie utworzenia instancji, po zakończeniu zwracamy potwierdzenie webhookiem.
Dezaktywacja licencji – analogiczny webhook.
Autologin: po kliknięciu w panelu sklep wysyła webhook z prośbą o redirect + token; odpowiadamy adresem HTTPS + jednorazowym tokenem, klient trafia do UI zalogowany jako dany tenant.
Podpisy (obustronne, data w UTC):
$sign = hash(
'sha256',
$developerLogin.'|'.date('Y-m-d').'|'.$applicationKey
);
Plan działania
-Odbiór applicationKey i URL-i webhooków z panelu sklepu.
-Implementacja endpointów: nowa licencja, usunięcie licencji, autologin + generowanie i weryfikacja podpisów SHA-256.
-Deszyfrowanie api_key.
-Obsługa trial/pełnych aktywacji i dezaktywacji.
-Po instalacji wysłanie potwierdzenia zakończenia procesu.
Posiadam dokumentację i App tester, by na bieżąco weryfikować działanie.
Oczekiwany efekt
Aplikacja w pełni multitenantowa, gotowa do publikacji w sklepie (App tester nie zgłasza błędów; „Open in panel” loguje w UI pod właściwym tenantem)