伺服器套件
本頁譯自英文。如兩者有出入,以英文頁面為準。 閱讀英文頁面
你的伺服器是嵌入中持有密鑰的那一半。伺服器套件封裝了你所用語言的 Lingara 函式庫,因此它可以用你的 OAuth 用戶端登入並為你的玩家核發權杖,驗證 Lingara 傳送給你的 webhook,並在玩家離開時刪除他們。下方的範例在每種語言中都依循相同的步驟。
建立按用量計費的用戶端
在主控台中建立一個 OAuth 用戶端,並把它設為按用量計費方案。授予它 embed:mint,也就是用於核發權杖和刪除玩家的權限範圍。任何其他方案上的用戶端都會被拒絕授予該權限範圍。同時授予它你希望玩家權杖攜帶的每一個權限範圍,因為權杖只能持有你的用戶端所持有的權限範圍。embed:mint 本身絕不會交給玩家。
把用戶端的 ID 和密鑰保存在伺服器的環境中,絕不要放進遊戲或頁面裡。
註冊你的網頁來源
網站小工具需要繫結到頁面來源的權杖。在主控台中,於用戶端的設定裡列出你的小工具執行的每一個來源,例如 https://www.example.com。你最多可以列出 10 個。來源由協定、主機和選用的連接埠組成,不含路徑。開發時,也允許使用你自己連接埠上的回送來源,例如 http://localhost:5173。權杖只在其核發時所對應的確切來源上被接受,因此為任何其他來源核發的權杖都會被 API 拒絕。遊戲不需要來源。
核發權杖
在你自己的登入之後核發:你的權杖路由先檢查你自己的工作階段,然後才為該玩家核發。依工作階段對該路由進行速率限制。核發要求包含三個欄位:
player_ref:你自己對該玩家的參照,1 到 128 位元組的 UTF-8。Lingara 只儲存它的雜湊值。
scopes:最多 5 個,取自玩家權杖可以持有的權限範圍:events:read、events:write、lesson_plans:read、lesson_plans:write 和 embed:play。省略它時,權杖會持有其中你的用戶端所持有的每一個。
origin:對於網站,即頁面的來源,必須是你已註冊的來源之一。對於遊戲則省略它。
回應包含 token、expires_at、expires_in(以秒表示的同一到期時間,適用於時鐘不可信的裝置)、subject、權杖的 scopes,以及 account_linked,它表示玩家是否已連結自己的 Lingara 帳戶。subject 向你的用戶端識別該玩家,關於該玩家的每個事件都會攜帶它。
把權杖及其到期時間完全依照套件的交接輸出交給玩家,透過你自己的工作階段傳遞,絕不放在 URL 中,並以 Cache-Control: no-store 傳送回應。玩家套件會在權杖接近到期時再次要求;權杖從不更新。
把 webhook 路由到對應的玩家
Lingara 會為傳送給你的每個 webhook 簽章。在進行任何 JSON 剖析之前,把原始要求主體交給套件,因為簽章涵蓋的是它的位元組。套件會驗證簽章,並在你自己的一張資料表中查找事件的 subject 所指明的玩家;這張資料表與你的玩家資料放在一起,把每個 subject 對應到你的 player_ref。連結了帳戶的玩家擁有兩個 subject,因此請讓 subject 欄位保持唯一,並允許同一個 player_ref 出現兩次。
傳遞至少一次:略過你已經處理過的事件 ID。在 10 秒內回應,並把任何耗時的處理放進你自己的佇列。
刪除玩家
在你自己的帳戶刪除流程中,依玩家的 player_ref 刪除該玩家。Lingara 會撤銷該玩家持有的每一個權杖,並移除為其儲存的一切。刪除不明的玩家同樣會成功,因此該呼叫可以安全地重複。刪除你自己的資料仍然是你的工作。
自備 Lingara 帳戶的玩家
擁有自己 Lingara 帳戶的玩家可以連結它,讓他們的練習和計畫保存在該帳戶上。目前還沒有套件封裝這項功能;它是從你的伺服器發出的兩個 API 呼叫。
你的伺服器使用與核發權杖相同的用戶端,以 PKCE 執行授權碼流程:玩家在自己的瀏覽器中登入並同意,絕不在你的遊戲內進行,然後你的伺服器用其密鑰交換授權碼。在該同意中要求 embed:play 以及你核發時使用的每一個權限範圍,並包含 events:read,否則玩家連結之後你將收不到任何關於該玩家的消息。
接著用該交換所回傳的委派權杖呼叫 linkEmbedPlayer,絕不要用你用戶端自己的權杖。它的回應包含:
status:此次呼叫建立了連結時為 linked,連結已經生效時為 existing;
subject:該帳戶的 subject,玩家此後的事件都會攜帶它;
previous_subject:訪客的 subject,玩家先前的事件保留它;
linked_at:連結建立的時間;
scopes:此後該玩家的權杖最多可以持有的權限範圍;
carried:此次呼叫依資料表移轉到該帳戶的資料列;
kept:它留給訪客的資料列,例如仍在撰寫中的計畫。
連結可以安全地重複,重複呼叫會完成 kept 所回報內容的移轉。把攜帶任一 subject 的事件路由到同一個 player_ref。你下次為該玩家核發權杖時,account_linked 會回傳 true,而玩家所做的一切仍由你付費。
要結束連結,請用你用戶端自己的權杖呼叫 unlinkEmbedPlayer。不會有任何內容移轉回訪客。學習者也可以自己結束連結,方法是在「已連結的 App」中移除你的 App。