# Jak se aplikace připojuje k OpenPlatform: spuštění a ověření

> Přesná výměna mezi OpenPlatform a aplikací: adresa, se kterou se otevírá, jak aplikace podepisuje svůj požadavek na /verify/ a údaje o uživateli, které dostane zpět.

Framework: openplatform
Product: OpenPlatform (openplatform@5)
Language: cs
Content-SHA256: b55048fbac7377372d439a35e88c331d83b7856f171adbd9fc52582de3f038e2
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: 
Review: not-recorded

Když uživatel otevře aplikaci, OpenPlatform jí neposílá heslo ani cookie. Pošle jí **jednorázovou spouštěcí adresu** a aplikace zavolá zpět OpenPlatform, aby zjistila, kdo je uživatel. Tato stránka sleduje kód (`schemas/account.js`, akce `Account/run` a `controllers/verify.js`).

## 1. Spuštění

Když uživatel klikne na aplikaci, portál zavolá API `run/{appid}`. OpenPlatform:

1. zkontroluje, zda je aplikace v seznamu uživatele (jinak `App not found`) a zda není zakázána;
2. vytvoří relaci aplikace (tabulka `tbl_app_session`), která vyprší podle nastavení `app_session_expire` (výchozí jeden den);
3. sestaví **ověřovací adresu**: `url` platformy + `/verify/?token=` + identifikátor relace spojený s identifikátorem instalace přes `X`, následovaný `X` a kontrolním součtem (`FUNC.checksum`, který používá tajemství `saltchecksum`);
4. odvodí dva tokeny této relace ze sdílených tajemství aplikace:
   - `reqtoken` = MD5 ověřovací adresy se solí `reqtoken` aplikace, malými písmeny;
   - `restoken` = MD5 tohoto `reqtoken` se solí `restoken` aplikace;
5. otevře aplikaci na její `url` s jedním dalším parametrem dotazu: `openplatform=<verification address>~<reqtoken>`.

U aplikace označené jako záložka žádná výměna není: adresa místo toho dostane `ssid=<session checksum>`.

## 2. Ověření

Aplikace vezme hodnotu `openplatform`, což je ověřovací adresa, `~` a `reqtoken` relace, a:

1. vypočítá **svůj vlastní** `restoken`: MD5 z `reqtoken` se solí `restoken`, který sdílí s OpenPlatform;
2. zavolá `GET` na celou hodnotu `openplatform` (`~` a `reqtoken` zůstanou v řetězci dotazu) s hlavičkou `x-token` nastavenou na tento `restoken`.

OpenPlatform poté (`controllers/verify.js`):

1. rozdělí token dotazu u posledního `~` (část za ním je `reqtoken`, který poslal) a odmítne volání, když chybí hlavička nebo token;
2. zkontroluje kontrolní součet identifikátoru relace, přečte relaci a porovná obě tajemství (`reqtoken` a `restoken` z hlavičky); jakýkoli rozdíl je `Invalid token`;
3. pokud má aplikace seznam povolených adres, zkontroluje adresu volajícího (`Not allowed IP address`);
4. přečte uživatele a odmítne zakázaného (`User has been disabled`) nebo neaktivního (`User is inactive`);
5. zajistí, aby měl uživatel odkazy na oznámení této aplikace (tabulka `tbl_user_app`);
6. sestaví odpověď a propustí ji přes transformaci `verify` platformy, takže nasazení může přidat pole.

Odpověď je objekt JSON. Prázdné hodnoty se z něj vypouštějí. Jeho hlavní pole jsou:

| Pole | Co to je |
|---|---|
| `id`, `name`, `email`, `photo`, `gender`, `reference` | kdo je uživatel (`photo` je absolutní adresa) |
| `language`, `color`, `interface`, `darkmode`, `sounds` | předvolby (jazyk a barva platformy, pokud je uživatel nemá) |
| `sa` | uživatel je správce platformy |
| `permissions` | řetězce `value` oprávnění uživatele v této aplikaci |
| `groups` | id skupin uživatele |
| `appid`, `ssid` | aplikace a kontrolní součet její relace |
| `openplatformid`, `openplatform` | identifikátor a adresa instalace |
| `iframe` | `true`, pokud aplikace není externí |
| `notify` | adresa, kam posílat oznámení, když je uživatel přijímá ([oznámení](/en/openplatform/notifications-and-public-api/)) |
| `platform` | `name` a `logo` platformy, její `groups` a aplikace uživatele |

Odpověď se uchovává v mezipaměti v paměti s klíčem tokenu relace (část před `~`) a mezipaměť se maže každé dvě minuty. Volání s tokenem, který je v této mezipaměti, se zodpoví z ní, ještě před opětovným porovnáním tajemství, takže opakované ověření v tomto čase je levné.

## 3. Opětovné zeptání později

`GET /session/` přijímá `ssid`, který aplikace dostala (jako název parametru přijímá také `openplatformid`, `token` a `session`), zkontroluje jeho kontrolní součet a vrátí uživatele (`id`, `language`, `name`, `color`, `sa`, `isonline`), dokud relace uživatele nevypršela.

## Na co pamatovat při tvorbě aplikace

- Nikdy neposílejte sdílená tajemství do prohlížeče: potřebuje je jen server aplikace.
- Ověřujte na **serveru** a z odpovědi si vytvořte vlastní relaci; parametr `openplatform` je na jedno spuštění.
- Používejte `permissions` z odpovědi, ne roli, kterou pošle prohlížeč.
- Total.js 5 má nativního klienta pro tuto rodinu protokolů: viz [OPENCLIENT](/en/total5/openclient-protocol/).
