Cum se conectează o aplicație la OpenPlatform: lansarea și verificarea
Când un utilizator deschide o aplicație, OpenPlatform nu îi trimite o parolă sau un cookie. Îi trimite o adresă de lansare de unică folosință, iar aplicația apelează înapoi OpenPlatform pentru a afla cine este utilizatorul. Această pagină urmează codul (schemas/account.js, acțiunea Account/run și controllers/verify.js).
1. Lansarea
Când utilizatorul face clic pe o aplicație, portalul apelează API-ul run/{appid}. OpenPlatform:
- verifică dacă aplicația este în lista utilizatorului (altfel
App not found) și dacă nu este dezactivată; - creează o sesiune a aplicației (tabelul
tbl_app_session) care expiră după setareaapp_session_expire(o zi implicit); - construiește adresa de verificare:
urlal platformei +/verify/?token=+ identificatorul sesiunii unit cu identificatorul instalației prinX, urmat deXși o sumă de control (FUNC.checksum, care folosește secretulsaltchecksum); - derivă cele două token-uri ale acelei sesiuni din secretele partajate ale aplicației:
reqtoken= MD5 al adresei de verificare cu sarereqtokenal aplicației, cu litere mici;restoken= MD5 al aceluireqtokencu sarerestokenal aplicației;
url cu un parametru de interogare în plus: openplatform=<verification address>~<reqtoken>.Pentru o aplicație marcată ca semn de carte nu există strângere de mână: adresa primește în schimb ssid=<session checksum>.
2. Verificarea
Aplicația ia valoarea openplatform, care este adresa de verificare, un ~ și reqtoken al sesiunii, și:
- calculează propriul
restoken: MD5 alreqtokencu sarerestokenpe care îl partajează cu OpenPlatform; - apelează cu
GETîntreaga valoareopenplatform(~șireqtokenrămân în query string) cu antetulx-tokensetat la acelrestoken.
OpenPlatform apoi (controllers/verify.js):
- împarte token-ul interogării la ultimul
~(partea de după estereqtokenpe care l-a trimis) și refuză apelul când lipsește antetul sau token-ul; - verifică suma de control a identificatorului de sesiune, citește sesiunea și compară ambele secrete (
reqtokenșirestokendin antet); orice diferență esteInvalid token; - dacă aplicația are o listă de adrese permise, verifică adresa apelantului (
Not allowed IP address); - citește utilizatorul și refuză un utilizator dezactivat (
User has been disabled) sau inactiv (User is inactive); - se asigură că utilizatorul are linkurile de notificare ale acestei aplicații (tabelul
tbl_user_app); - construiește răspunsul și îl trece prin transformarea
verifya platformei, astfel încât o implementare să poată adăuga câmpuri.
Răspunsul este un obiect JSON. Valorile goale sunt eliminate din el. Câmpurile lui principale sunt:
| Câmp | Ce este |
|---|---|
id, name, email, photo, gender, reference | cine este utilizatorul (photo este o adresă absolută) |
language, color, interface, darkmode, sounds | preferințele (limba și culoarea platformei când utilizatorul nu are) |
sa | utilizatorul este administrator al platformei |
permissions | șirurile value ale permisiunilor utilizatorului în această aplicație |
groups | id-urile grupurilor utilizatorului |
appid, ssid | aplicația și suma de control a sesiunii ei |
openplatformid, openplatform | identificatorul și adresa instalației |
iframe | true cu excepția cazului în care aplicația este externă |
notify | adresa la care se trimit notificările, când utilizatorul le acceptă (notificări) |
platform | name și logo ale platformei, groups ale ei și aplicațiile utilizatorului |
Răspunsul este păstrat într-un cache în memorie având drept cheie token-ul sesiunii (partea dinaintea lui ~), iar cache-ul este golit la fiecare două minute. Un apel cu un token aflat în acel cache primește răspunsul din el, înainte ca secretele să fie comparate din nou; o verificare repetată în acel interval este deci ieftină.
3. Întrebarea din nou, mai târziu
GET /session/ primește ssid pe care l-a primit aplicația (acceptă și openplatformid, token și session ca nume al parametrului), îi verifică suma de control și returnează utilizatorul (id, language, name, color, sa, isonline) cât timp sesiunea utilizatorului nu a expirat.
Ce să ții minte când construiești aplicația
- Nu trimite niciodată secretele partajate către browser: doar serverul aplicației are nevoie de ele.
- Verifică pe server și creează-ți propria sesiune din răspuns; parametrul
openplatformeste pentru o singură lansare. - Folosește
permissionsdin răspuns, nu un rol trimis de browser. - Total.js 5 are un client nativ pentru această familie de protocoale: vezi OPENCLIENT.