# Hogyan csatlakozik egy alkalmazás az OpenPlatformhoz: az indítás és az ellenőrzés

> A pontos kézfogás az OpenPlatform és egy alkalmazás között: a cím, amellyel megnyílik, hogyan írja alá az alkalmazás a /verify/ felé küldött kérését, és milyen felhasználói adatokat kap vissza.

Framework: openplatform
Product: OpenPlatform (openplatform@5)
Language: hu
Content-SHA256: 633014eaa23a2df4be069108c6910cf46226e0734c1e79ad43e2bcad5fe343a2
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: 
Review: not-recorded

Amikor egy felhasználó megnyit egy alkalmazást, az OpenPlatform nem küld neki jelszót vagy cookie-t. Egy **egyszer használatos indítási címet** küld, és az alkalmazás visszahív az OpenPlatformhoz, hogy megtudja, ki a felhasználó. Ez az oldal a kódot követi (`schemas/account.js`, `Account/run` művelet és `controllers/verify.js`).

## 1. Az indítás

Amikor a felhasználó rákattint egy alkalmazásra, a portál meghívja a `run/{appid}` API-t. Az OpenPlatform:

1. ellenőrzi, hogy az alkalmazás a felhasználó listáján van-e (különben `App not found`), és hogy nincs-e letiltva;
2. létrehoz egy alkalmazásmunkamenetet (`tbl_app_session` tábla), amely az `app_session_expire` beállítás szerint jár le (alapértelmezés szerint egy nap);
3. felépíti az **ellenőrzési címet**: a platform `url` címe + `/verify/?token=` + a munkamenet azonosítója `X`-szel összefűzve a telepítés azonosítójával, majd `X` és egy ellenőrző összeg (`FUNC.checksum`, amely a `saltchecksum` titkot használja);
4. levezeti a munkamenet két tokenjét az alkalmazás megosztott titkaiból:
   - `reqtoken` = az ellenőrzési cím MD5 értéke az alkalmazás `reqtoken` értékével sózva, kisbetűvel;
   - `restoken` = az adott `reqtoken` MD5 értéke az alkalmazás `restoken` értékével sózva;
5. megnyitja az alkalmazást az `url` címén egy extra lekérdezési paraméterrel: `openplatform=<verification address>~<reqtoken>`.

A könyvjelzőként megjelölt alkalmazásnál nincs kézfogás: a cím helyette `ssid=<session checksum>` értéket kap.

## 2. Az ellenőrzés

Az alkalmazás veszi az `openplatform` értékét, amely az ellenőrzési cím, egy `~` és a munkamenet `reqtoken` értéke, és:

1. kiszámítja a **saját** `restoken` értékét: a `reqtoken` MD5 értékét az OpenPlatformmal megosztott `restoken` értékkel sózva;
2. `GET` hívást intéz az `openplatform` teljes értékére (a `~` és a `reqtoken` a query stringben marad), az `x-token` fejlécet erre a `restoken` értékre állítva.

Az OpenPlatform ezután (`controllers/verify.js`):

1. a lekérdezési tokent az utolsó `~` mentén szétvágja (az utána következő rész az általa küldött `reqtoken`), és elutasítja a hívást, ha hiányzik a fejléc vagy a token;
2. ellenőrzi a munkamenet-azonosító ellenőrző összegét, beolvassa a munkamenetet, és összeveti mindkét titkot (a `reqtoken` és a fejléc `restoken` értéke); bármely eltérés `Invalid token`;
3. ha az alkalmazásnak van engedélyezett címek listája, ellenőrzi a hívó címét (`Not allowed IP address`);
4. beolvassa a felhasználót, és elutasít egy letiltott (`User has been disabled`) vagy inaktív (`User is inactive`) felhasználót;
5. gondoskodik róla, hogy a felhasználónak megvannak ennek az alkalmazásnak az értesítési hivatkozásai (`tbl_user_app` tábla);
6. felépíti a választ, és átvezeti a platform `verify` átalakításán, így egy telepítés mezőket adhat hozzá.

A válasz egy JSON objektum. Az üres értékeket kihagyja. A fő mezői:

| Mező | Mi ez |
|---|---|
| `id`, `name`, `email`, `photo`, `gender`, `reference` | ki a felhasználó (a `photo` abszolút cím) |
| `language`, `color`, `interface`, `darkmode`, `sounds` | a beállítások (a platform nyelve és színe, ha a felhasználónak nincs) |
| `sa` | a felhasználó a platform adminisztrátora |
| `permissions` | a felhasználó jogosultságainak `value` karakterláncai ebben az alkalmazásban |
| `groups` | a felhasználó csoportjainak azonosítói |
| `appid`, `ssid` | az alkalmazás és a munkamenete ellenőrző összege |
| `openplatformid`, `openplatform` | a telepítés azonosítója és címe |
| `iframe` | `true`, kivéve ha az alkalmazás külső |
| `notify` | a cím, ahová az értesítéseket küldeni kell, ha a felhasználó elfogadja őket ([értesítések](/en/openplatform/notifications-and-public-api/)) |
| `platform` | a platform `name` és `logo` értéke, a `groups` és a felhasználó alkalmazásai |

A választ egy memóriabeli gyorsítótár tárolja a munkamenet tokenjével (a `~` előtti rész) kulcsolva, és a gyorsítótár kétpercenként törlődik. Az ebben a gyorsítótárban lévő tokennel érkező hívást a gyorsítótárból válaszolja meg, még a titkok újbóli összevetése előtt, így az ezen időn belüli ismételt ellenőrzés olcsó.

## 3. Újabb kérdezés később

A `GET /session/` az alkalmazás által kapott `ssid` értéket veszi (a paraméter nevének az `openplatformid`, a `token` és a `session` is elfogadott), ellenőrzi az ellenőrző összegét, és visszaadja a felhasználót (`id`, `language`, `name`, `color`, `sa`, `isonline`), amíg a felhasználó munkamenete nem járt le.

## Mire emlékezz az alkalmazás építésekor

- Soha ne küldd a megosztott titkokat a böngészőnek: csak az alkalmazás szerverének van rájuk szüksége.
- A **szerveren** ellenőrizz, és a válaszból hozd létre a saját munkamenetedet; az `openplatform` paraméter egyetlen indításra való.
- A válasz `permissions` értékeit használd, ne a böngésző által küldött szerepkört.
- A Total.js 5-ben van natív kliens ehhez a protokollcsaládhoz: lásd [OPENCLIENT](/en/total5/openclient-protocol/).
