# Hur en applikation ansluter till OpenPlatform: starten och verifieringen

> Den exakta handskakningen mellan OpenPlatform och en applikation: adressen den öppnas med, hur applikationen signerar sin begäran till /verify/ och användardatan den får tillbaka.

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

När en användare öppnar en applikation skickar OpenPlatform inget lösenord eller någon cookie till den. Den skickar en **startadress för engångsbruk**, och applikationen ringer tillbaka till OpenPlatform för att få veta vem användaren är. Den här sidan följer koden (`schemas/account.js`, åtgärden `Account/run` och `controllers/verify.js`).

## 1. Starten

När användaren klickar på en applikation anropar portalen API:et `run/{appid}`. OpenPlatform:

1. kontrollerar att applikationen finns i användarens lista (annars `App not found`) och att den inte är inaktiverad;
2. skapar en session för applikationen (tabellen `tbl_app_session`) som löper ut enligt inställningen `app_session_expire` (en dag som standard);
3. bygger **verifieringsadressen**: plattformens `url` + `/verify/?token=` + sessionens identifierare sammanfogad med installationens identifierare med `X`, följt av `X` och en kontrollsumma (`FUNC.checksum`, som använder hemligheten `saltchecksum`);
4. härleder sessionens två tokens från applikationens delade hemligheter:
   - `reqtoken` = MD5 av verifieringsadressen saltad med applikationens `reqtoken`, med gemener;
   - `restoken` = MD5 av den `reqtoken` saltad med applikationens `restoken`;
5. öppnar applikationen på dess `url` med en extra frågeparameter: `openplatform=<verification address>~<reqtoken>`.

För en applikation som är markerad som bokmärke finns ingen handskakning: adressen får `ssid=<session checksum>` i stället.

## 2. Verifieringen

Applikationen tar värdet av `openplatform`, som är verifieringsadressen, ett `~` och sessionens `reqtoken`, och:

1. beräknar **sitt eget** `restoken`: MD5 av `reqtoken` saltad med den `restoken` den delar med OpenPlatform;
2. anropar med `GET` hela värdet av `openplatform` (`~` och `reqtoken` stannar kvar i query-strängen) med headern `x-token` satt till den `restoken`.

OpenPlatform därefter (`controllers/verify.js`):

1. delar frågetoken vid det sista `~` (delen efter är den `reqtoken` som skickades) och avvisar anropet när headern eller token saknas;
2. kontrollerar sessionsidentifierarens kontrollsumma, läser sessionen och jämför båda hemligheterna (`reqtoken` och headerns `restoken`); varje skillnad är `Invalid token`;
3. om applikationen har en lista över tillåtna adresser kontrolleras anroparens adress (`Not allowed IP address`);
4. läser användaren och avvisar en inaktiverad (`User has been disabled`) eller inaktiv (`User is inactive`) användare;
5. ser till att användaren har den här applikationens notislänkar (tabellen `tbl_user_app`);
6. bygger svaret och skickar det genom plattformens transformation `verify`, så att en driftsättning kan lägga till fält.

Svaret är ett JSON-objekt. Tomma värden utelämnas. Dess huvudfält är:

| Fält | Vad det är |
|---|---|
| `id`, `name`, `email`, `photo`, `gender`, `reference` | vem användaren är (`photo` är en absolut adress) |
| `language`, `color`, `interface`, `darkmode`, `sounds` | inställningarna (plattformens språk och färg när användaren inte har några) |
| `sa` | användaren är administratör för plattformen |
| `permissions` | `value`-strängarna för användarens behörigheter i den här applikationen |
| `groups` | id:n för användarens grupper |
| `appid`, `ssid` | applikationen och kontrollsumman för dess session |
| `openplatformid`, `openplatform` | installationens identifierare och adress |
| `iframe` | `true` om inte applikationen är extern |
| `notify` | adressen att skicka notiser till, när användaren godtar dem ([notiser](/en/openplatform/notifications-and-public-api/)) |
| `platform` | plattformens `name` och `logo`, dess `groups` och användarens applikationer |

Svaret hålls i en minnescache med sessionens token (delen före `~`) som nyckel, och cachen töms varannan minut. Ett anrop med en token som finns i den cachen besvaras därifrån, innan hemligheterna jämförs igen; en upprepad verifiering inom den tiden är därför billig.

## 3. Fråga igen senare

`GET /session/` tar den `ssid` som applikationen fick (den accepterar också `openplatformid`, `token` och `session` som parameterns namn), kontrollerar dess kontrollsumma och returnerar användaren (`id`, `language`, `name`, `color`, `sa`, `isonline`) så länge användarens session inte har löpt ut.

## Vad du ska komma ihåg när du bygger applikationen

- Skicka aldrig de delade hemligheterna till webbläsaren: bara applikationens server behöver dem.
- Verifiera på **servern** och skapa din egen session utifrån svaret; parametern `openplatform` gäller för en start.
- Använd svarets `permissions`, inte en roll som webbläsaren skickar.
- Total.js 5 har en inbyggd klient för den här protokollfamiljen: se [OPENCLIENT](/en/total5/openclient-protocol/).
