ForgeOpenPlatform
cs

OpenPlatform

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

OpenPlatform · openplatform@5 openplatformprotocoltokensverifysso

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;
  • 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:

    PoleCo to je
    id, name, email, photo, gender, referencekdo je uživatel (photo je absolutní adresa)
    language, color, interface, darkmode, soundspředvolby (jazyk a barva platformy, pokud je uživatel nemá)
    sauživatel je správce platformy
    permissionsřetězce value oprávnění uživatele v této aplikaci
    groupsid skupin uživatele
    appid, ssidaplikace a kontrolní součet její relace
    openplatformid, openplatformidentifikátor a adresa instalace
    iframetrue, pokud aplikace není externí
    notifyadresa, kam posílat oznámení, když je uživatel přijímá (oznámení)
    platformname 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.