サーバーキット
このページは英語から翻訳されています。内容に相違がある場合は、英語のページが正しい内容です。 英語のページを読む
あなたのサーバーは、埋め込みのうちシークレットを保持する側です。サーバーキットはあなたの言語の Lingara ライブラリをラップしているので、OAuth クライアントでサインインしてプレイヤーのためにトークンを発行し、Lingara から送られる Webhook を検証し、プレイヤーが去るときにそのプレイヤーを削除します。以下のサンプルは、各言語で同じ手順に従っています。
従量課金クライアントを作成する
コンソールで OAuth クライアントを作成し、従量課金プランに設定します。トークンを発行し、プレイヤーを削除するためのスコープである embed:mint を付与してください。他のプランのクライアントには、このスコープは拒否されます。また、プレイヤーのトークンに持たせたいすべてのスコープもクライアントに付与してください。トークンが持てるのは、クライアントが持っているスコープだけだからです。embed:mint そのものがプレイヤーに渡されることはありません。
クライアントの ID とシークレットはサーバーの環境に保管し、ゲームやページには決して含めないでください。
Web オリジンを登録する
ウェブサイトウィジェットには、ページのオリジンに結び付けられたトークンが必要です。コンソールで、クライアントの設定に、https://www.example.com のように、ウィジェットが動作するすべてのオリジンを列挙します。列挙できるのは最大 10 個です。オリジンはスキーム、ホスト、省略可能なポートから成り、パスは含みません。開発用には、http://localhost:5173 のように、自分で選んだポートのループバックオリジンも使えます。トークンは発行対象となったオリジンとまったく同じオリジンからのみ受け付けられるため、他のオリジン向けに発行されたトークンは API によって拒否されます。ゲームにはオリジンは不要です。
トークンを発行する
発行は、あなた自身のサインインの後ろで行います。トークンルートはまず自分のセッションを確認し、そのうえでそのプレイヤーのために発行します。ルートにはセッションごとのレート制限をかけてください。発行リクエストは 3 つのフィールドを取ります:
player_ref:プレイヤーに対するあなた自身の参照で、UTF-8 で 1~128 バイトです。Lingara はそのハッシュだけを保存します。
scopes:最大 5 個で、プレイヤーのトークンが持てるもの、つまり events:read、events:write、lesson_plans:read、lesson_plans:write、embed:play から選びます。省略すると、トークンはこれらのうちクライアントが持つすべてを持ちます。
origin:ウェブサイトの場合はページのオリジンで、登録済みのものでなければなりません。ゲームの場合は省略します。
応答には token、expires_at、expires_in(同じ有効期限を秒で表したもので、時計を信頼できないデバイス向け)、subject、トークンの scopes、そしてプレイヤーが自分の Lingara アカウントをリンクしたかどうかを示す account_linked が含まれます。subject はあなたのクライアントに対してプレイヤーを識別するもので、そのプレイヤーに関するすべてのイベントがこれを持ちます。
プレイヤーには、キットのハンドオフが書き出すとおりにトークンとその有効期限を渡してください。自分のセッションを通じて渡し、URL には決して含めず、応答は Cache-Control: no-store 付きで送ります。プレイヤーキットはトークンの有効期限が近づくと再び要求します。トークンが更新されることはありません。
Webhook をプレイヤーにルーティングする
Lingara は送信するすべての Webhook に署名します。署名はリクエストボディのバイト列を対象とするため、JSON の解析を行う前の生のリクエストボディをキットに渡してください。キットは署名を検証し、イベントの subject が指すプレイヤーを、あなた自身のテーブルで調べます。このテーブルはプレイヤー情報の隣に置き、各サブジェクトをあなたの player_ref に対応付けます。アカウントをリンクしたプレイヤーは 2 つのサブジェクトを持つため、サブジェクトの列は一意にし、1 つの player_ref が 2 回現れることを許してください。
配信は少なくとも 1 回です。すでに処理したイベント ID はスキップしてください。10 秒以内に応答し、時間のかかる処理はあなた自身のキューに回してください。
プレイヤーを削除する
あなた自身のアカウント削除処理から、player_ref を指定してプレイヤーを削除します。Lingara はそのプレイヤーが持つすべてのトークンを取り消し、そのプレイヤーについて保存しているすべてを削除します。存在しないプレイヤーの削除も成功するため、この呼び出しは繰り返しても安全です。あなた自身のデータの削除は、引き続きあなたの役目です。
自分の Lingara アカウントを持ち込むプレイヤー
自分の Lingara アカウントを持つプレイヤーは、それをリンクして、練習やプランをそのアカウントに置くことができます。これをラップするキットはまだありません。あなたのサーバーから行う 2 回の API 呼び出しです。
あなたのサーバーは、発行に使うのと同じクライアントで、PKCE を使った認可コードフローを実行します。プレイヤーはゲーム内ではなく必ずブラウザーでサインインして同意し、あなたのサーバーはそのシークレットを使ってコードを交換します。その同意では embed:play と発行に使うすべてのスコープを求め、さらに events:read を含めてください。含めないと、プレイヤーがリンクした後、そのプレイヤーについて何も届かなくなります。
次に、その交換で返された委任トークンを使って linkEmbedPlayer を呼び出します。クライアント自身のトークンは決して使いません。応答には次が含まれます:
status:この呼び出しでリンクした場合は linked、すでに有効だった場合は existing。
subject:アカウントのサブジェクトで、今後のプレイヤーのイベントはこれを持ちます。
previous_subject:ゲストのサブジェクトで、以前のイベントはこれを保持します。
linked_at:リンクが作成された日時。
scopes:このプレイヤーのトークンが今後持てるスコープの上限。
carried:この呼び出しがアカウントに移した行(テーブルごと)。
kept:まだ作成中のプランなど、ゲスト側に残した行。
リンクは繰り返しても安全で、繰り返すと kept が報告したものの移動が完了します。どちらのサブジェクトを持つイベントも、同じ player_ref にルーティングしてください。そのプレイヤーへの次回の発行では account_linked が true になり、プレイヤーの行動に対する支払いは引き続きあなたが行います。
リンクを解除するには、クライアント自身のトークンで unlinkEmbedPlayer を呼び出します。ゲストに戻るものはありません。学習者自身も、接続済みアプリからあなたのアプリを削除することで、リンクを解除できます。