# Ako sa aplikácia pripája k OpenPlatform: spustenie a overenie

> Presná výmena medzi OpenPlatform a aplikáciou: adresa, s ktorou sa otvára, ako aplikácia podpisuje svoju požiadavku na /verify/ a údaje o používateľovi, ktoré dostane späť.

Framework: openplatform
Product: OpenPlatform (openplatform@5)
Language: sk
Content-SHA256: 0fe6e52f29cf0d49c29f9ac79cb0942411671e94904a19fb15181d565dc2a86b
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: 
Review: not-recorded

Keď používateľ otvorí aplikáciu, OpenPlatform jej neposiela heslo ani cookie. Pošle jej **jednorazovú spúšťaciu adresu** a aplikácia zavolá späť OpenPlatform, aby zistila, kto je používateľ. Táto stránka sleduje kód (`schemas/account.js`, akcia `Account/run` a `controllers/verify.js`).

## 1. Spustenie

Keď používateľ klikne na aplikáciu, portál zavolá API `run/{appid}`. OpenPlatform:

1. skontroluje, či je aplikácia v zozname používateľa (inak `App not found`) a či nie je zakázaná;
2. vytvorí reláciu aplikácie (tabuľka `tbl_app_session`), ktorá vyprší podľa nastavenia `app_session_expire` (predvolene jeden deň);
3. zostaví **overovaciu adresu**: `url` platformy + `/verify/?token=` + identifikátor relácie spojený s identifikátorom inštalácie cez `X`, nasledovaný `X` a kontrolným súčtom (`FUNC.checksum`, ktorý používa tajomstvo `saltchecksum`);
4. odvodí dva tokeny tejto relácie zo zdieľaných tajomstiev aplikácie:
   - `reqtoken` = MD5 overovacej adresy so soľou `reqtoken` aplikácie, malými písmenami;
   - `restoken` = MD5 tohto `reqtoken` so soľou `restoken` aplikácie;
5. otvorí aplikáciu na jej `url` s jedným ďalším parametrom dotazu: `openplatform=<verification address>~<reqtoken>`.

Pri aplikácii označenej ako záložka nie je žiadna výmena: adresa namiesto toho dostane `ssid=<session checksum>`.

## 2. Overenie

Aplikácia vezme hodnotu `openplatform`, čo je overovacia adresa, `~` a `reqtoken` relácie, a:

1. vypočíta **svoj vlastný** `restoken`: MD5 z `reqtoken` so soľou `restoken`, ktorý zdieľa s OpenPlatform;
2. zavolá `GET` na celú hodnotu `openplatform` (`~` a `reqtoken` zostanú v reťazci dotazu) s hlavičkou `x-token` nastavenou na tento `restoken`.

OpenPlatform potom (`controllers/verify.js`):

1. rozdelí token dotazu pri poslednom `~` (časť za ním je `reqtoken`, ktorý poslal) a odmietne volanie, keď chýba hlavička alebo token;
2. skontroluje kontrolný súčet identifikátora relácie, prečíta reláciu a porovná obe tajomstvá (`reqtoken` a `restoken` z hlavičky); akýkoľvek rozdiel je `Invalid token`;
3. ak má aplikácia zoznam povolených adries, skontroluje adresu volajúceho (`Not allowed IP address`);
4. prečíta používateľa a odmietne zakázaného (`User has been disabled`) alebo neaktívneho (`User is inactive`);
5. zabezpečí, aby mal používateľ odkazy na oznámenia tejto aplikácie (tabuľka `tbl_user_app`);
6. zostaví odpoveď a prepustí ju cez transformáciu `verify` platformy, takže nasadenie môže pridať polia.

Odpoveď je objekt JSON. Prázdne hodnoty sa z neho vypúšťajú. Jeho hlavné polia sú:

| Pole | Čo to je |
|---|---|
| `id`, `name`, `email`, `photo`, `gender`, `reference` | kto je používateľ (`photo` je absolútna adresa) |
| `language`, `color`, `interface`, `darkmode`, `sounds` | preferencie (jazyk a farba platformy, ak ich používateľ nemá) |
| `sa` | používateľ je správca platformy |
| `permissions` | reťazce `value` oprávnení používateľa v tejto aplikácii |
| `groups` | id skupín používateľa |
| `appid`, `ssid` | aplikácia a kontrolný súčet jej relácie |
| `openplatformid`, `openplatform` | identifikátor a adresa inštalácie |
| `iframe` | `true`, pokiaľ aplikácia nie je externá |
| `notify` | adresa, kam posielať oznámenia, keď ich používateľ prijíma ([oznámenia](/en/openplatform/notifications-and-public-api/)) |
| `platform` | `name` a `logo` platformy, jej `groups` a aplikácie používateľa |

Odpoveď sa uchováva vo vyrovnávacej pamäti v pamäti s kľúčom tokenu relácie (časť pred `~`) a pamäť sa vymaže každé dve minúty. Volanie s tokenom, ktorý je v tejto pamäti, sa zodpovie z nej, ešte pred opätovným porovnaním tajomstiev, takže opakované overenie v tomto čase je lacné.

## 3. Opätovné opýtanie neskôr

`GET /session/` prijíma `ssid`, ktorý aplikácia dostala (ako názov parametra prijíma aj `openplatformid`, `token` a `session`), skontroluje jeho kontrolný súčet a vráti používateľa (`id`, `language`, `name`, `color`, `sa`, `isonline`), kým relácia používateľa nevypršala.

## Na čo pamätať pri tvorbe aplikácie

- Nikdy neposielajte zdieľané tajomstvá do prehliadača: potrebuje ich iba server aplikácie.
- Overujte na **serveri** a z odpovede si vytvorte vlastnú reláciu; parameter `openplatform` je na jedno spustenie.
- Používajte `permissions` z odpovede, nie rolu, ktorú pošle prehliadač.
- Total.js 5 má natívneho klienta pre túto rodinu protokolov: pozri [OPENCLIENT](/en/total5/openclient-protocol/).
