Jak aplikacja łączy się z OpenPlatform: uruchomienie i weryfikacja
Gdy użytkownik otwiera aplikację, OpenPlatform nie wysyła jej hasła ani cookie. Wysyła jednorazowy adres uruchomienia, a aplikacja oddzwania do OpenPlatform, aby dowiedzieć się, kim jest użytkownik. Ta strona podąża za kodem (schemas/account.js, akcja Account/run i controllers/verify.js).
1. Uruchomienie
Gdy użytkownik kliknie aplikację, portal wywołuje API run/{appid}. OpenPlatform:
- sprawdza, czy aplikacja jest na liście użytkownika (w przeciwnym razie
App not found) i czy nie jest wyłączona; - tworzy sesję aplikacji (tabela
tbl_app_session), która wygasa według ustawieniaapp_session_expire(domyślnie jeden dzień); - buduje adres weryfikacji:
urlplatformy +/verify/?token=+ identyfikator sesji połączony z identyfikatorem instalacji przezX, a po nimXi suma kontrolna (FUNC.checksum, która używa sekretusaltchecksum); - wyprowadza dwa tokeny tej sesji ze wspólnych sekretów aplikacji:
reqtoken= MD5 adresu weryfikacji z soląreqtokenaplikacji, małymi literami;restoken= MD5 tegoreqtokenz soląrestokenaplikacji;
url z jednym dodatkowym parametrem zapytania: openplatform=<verification address>~<reqtoken>.Dla aplikacji oznaczonej jako zakładka nie ma uścisku dłoni: adres otrzymuje zamiast tego ssid=<session checksum>.
2. Weryfikacja
Aplikacja bierze wartość openplatform, czyli adres weryfikacji, znak ~ i reqtoken sesji, i:
- oblicza własny
restoken: MD5 zreqtokenz soląrestoken, który dzieli z OpenPlatform; - wywołuje
GETna całej wartościopenplatform(~ireqtokenzostają w query string) z nagłówkiemx-tokenustawionym na tenrestoken.
OpenPlatform następnie (controllers/verify.js):
- dzieli token zapytania na ostatnim
~(część po nim toreqtoken, który wysłał) i odrzuca wywołanie, gdy brakuje nagłówka lub tokenu; - sprawdza sumę kontrolną identyfikatora sesji, odczytuje sesję i porównuje oba sekrety (
reqtokenirestokenz nagłówka); każda różnica toInvalid token; - jeśli aplikacja ma listę dozwolonych adresów, sprawdza adres wywołującego (
Not allowed IP address); - odczytuje użytkownika i odrzuca wyłączonego (
User has been disabled) lub nieaktywnego (User is inactive); - upewnia się, że użytkownik ma odnośniki powiadomień tej aplikacji (tabela
tbl_user_app); - buduje odpowiedź i przepuszcza ją przez transformację
verifyplatformy, aby wdrożenie mogło dodać pola.
Odpowiedź to obiekt JSON. Puste wartości są z niego usuwane. Jego główne pola to:
| Pole | Co to jest |
|---|---|
id, name, email, photo, gender, reference | kim jest użytkownik (photo to adres bezwzględny) |
language, color, interface, darkmode, sounds | preferencje (język i kolor platformy, gdy użytkownik ich nie ma) |
sa | użytkownik jest administratorem platformy |
permissions | ciągi value uprawnień użytkownika w tej aplikacji |
groups | identyfikatory grup użytkownika |
appid, ssid | aplikacja i suma kontrolna jej sesji |
openplatformid, openplatform | identyfikator i adres instalacji |
iframe | true, chyba że aplikacja jest zewnętrzna |
notify | adres, na który wysyłać powiadomienia, gdy użytkownik je akceptuje (powiadomienia) |
platform | name i logo platformy, jej groups i aplikacje użytkownika |
Odpowiedź jest przechowywana w pamięci podręcznej w pamięci operacyjnej z kluczem w postaci tokenu sesji (część przed ~), a pamięć jest czyszczona co dwie minuty. Wywołanie z tokenem, który jest w tej pamięci, otrzymuje odpowiedź z niej, zanim sekrety zostaną ponownie porównane, więc powtórna weryfikacja w tym czasie jest tania.
3. Ponowne zapytanie później
GET /session/ przyjmuje ssid, który otrzymała aplikacja (jako nazwę parametru akceptuje też openplatformid, token i session), sprawdza jego sumę kontrolną i zwraca użytkownika (id, language, name, color, sa, isonline), dopóki sesja użytkownika nie wygasła.
O czym pamiętać, budując aplikację
- Nigdy nie wysyłaj wspólnych sekretów do przeglądarki: potrzebuje ich tylko serwer aplikacji.
- Weryfikuj na serwerze i utwórz własną sesję z odpowiedzi; parametr
openplatformjest na jedno uruchomienie. - Używaj
permissionsz odpowiedzi, a nie roli wysłanej przez przeglądarkę. - Total.js 5 ma natywnego klienta dla tej rodziny protokołów: zobacz OPENCLIENT.