Comment une application se connecte à OpenPlatform : le lancement et la vérification
Quand un utilisateur ouvre une application, OpenPlatform ne lui envoie ni mot de passe ni cookie. Il lui envoie une adresse de lancement à usage unique, et l’application rappelle OpenPlatform pour savoir qui est l’utilisateur. Cette page suit le code (schemas/account.js, action Account/run, et controllers/verify.js).
1. Le lancement
Quand l’utilisateur clique sur une application, le portail appelle l’API run/{appid}. OpenPlatform :
- vérifie que l’application figure dans la liste de l’utilisateur (sinon
App not found) et qu’elle n’est pas désactivée ; - crée une session de l’application (table
tbl_app_session) qui expire selon le réglageapp_session_expire(un jour par défaut) ; - construit l’adresse de vérification : l’
urlde la plateforme +/verify/?token=+ l’identifiant de la session joint à l’identifiant de l’installation parX, suivi deXet d’une somme de contrôle (FUNC.checksum, qui utilise le secretsaltchecksum) ; - dérive les deux jetons de cette session à partir des secrets partagés de l’application :
reqtoken= le MD5 de l’adresse de vérification salée avec lereqtokende l’application, en minuscules ;restoken= le MD5 de cereqtokensalé avec lerestokende l’application ;
url avec un paramètre de requête supplémentaire : openplatform=<verification address>~<reqtoken>.Pour une application marquée comme signet, il n’y a pas d’échange : l’adresse reçoit ssid=<session checksum> à la place.
2. La vérification
L’application prend la valeur de openplatform, qui est l’adresse de vérification, un ~ et le reqtoken de la session, et :
- calcule son propre
restoken: le MD5 dureqtokensalé avec lerestokenqu’elle partage avec OpenPlatform ; - appelle en
GETla valeur entière deopenplatform(le~et lereqtokenrestent dans la query string) avec l’en-têtex-tokenfixé à cerestoken.
OpenPlatform ensuite (controllers/verify.js) :
- découpe le jeton de la requête au dernier
~(la partie qui suit est lereqtokenqu’il a envoyé) et refuse l’appel quand l’en-tête ou le jeton manque ; - vérifie la somme de contrôle de l’identifiant de session, lit la session et compare les deux secrets (
reqtokenet lerestokende l’en-tête) ; toute différence donneInvalid token; - si l’application a une liste d’adresses autorisées, vérifie l’adresse de l’appelant (
Not allowed IP address) ; - lit l’utilisateur et refuse un utilisateur désactivé (
User has been disabled) ou inactif (User is inactive) ; - s’assure que l’utilisateur a les liens de notification de cette application (table
tbl_user_app) ; - construit la réponse et la fait passer par la transformation
verifyde la plateforme, de sorte qu’un déploiement puisse ajouter des champs.
La réponse est un objet JSON. Les valeurs vides en sont retirées. Ses principaux champs sont :
| Champ | Ce que c’est |
|---|---|
id, name, email, photo, gender, reference | qui est l’utilisateur (photo est une adresse absolue) |
language, color, interface, darkmode, sounds | les préférences (la langue et la couleur de la plateforme quand l’utilisateur n’en a pas) |
sa | l’utilisateur est administrateur de la plateforme |
permissions | les chaînes value des permissions de l’utilisateur dans cette application |
groups | les ids des groupes de l’utilisateur |
appid, ssid | l’application et la somme de contrôle de sa session |
openplatformid, openplatform | l’identifiant et l’adresse de l’installation |
iframe | true sauf si l’application est externe |
notify | l’adresse où envoyer les notifications, quand l’utilisateur les accepte (notifications) |
platform | le name et le logo de la plateforme, ses groups et les applications de l’utilisateur |
La réponse est conservée dans un cache en mémoire indexé par le jeton de la session (la partie avant le ~) et le cache est vidé toutes les deux minutes. Un appel avec un jeton présent dans ce cache reçoit sa réponse depuis lui, avant que les secrets soient comparés à nouveau ; une vérification répétée dans ce délai est donc peu coûteuse.
3. Redemander plus tard
GET /session/ prend le ssid que l’application a reçu (elle accepte aussi openplatformid, token et session comme nom du paramètre), vérifie sa somme de contrôle et renvoie l’utilisateur (id, language, name, color, sa, isonline) tant que la session de l’utilisateur n’a pas expiré.
Ce qu’il faut retenir en construisant l’application
- N’envoyez jamais les secrets partagés au navigateur : seul le serveur de l’application en a besoin.
- Vérifiez sur le serveur et créez votre propre session à partir de la réponse ; le paramètre
openplatformsert pour un seul lancement. - Utilisez les
permissionsde la réponse, pas un rôle envoyé par le navigateur. - Total.js 5 possède un client natif pour cette famille de protocoles : voir OPENCLIENT.