服务器工具包
本页译自英文。如两者有出入,以英文页面为准。 阅读英文页面
你的服务器是嵌入中持有密钥的那一半。服务器工具包封装了你所用语言的 Lingara 库,因此它可以用你的 OAuth 客户端登录并为你的玩家签发令牌,校验 Lingara 发送给你的 webhook,并在玩家离开时删除他们。下方的示例在每种语言中都遵循相同的步骤。
创建按用量计费的客户端
在控制台中创建一个 OAuth 客户端,并把它设为按用量计费方案。授予它 embed:mint,即用于签发令牌和删除玩家的权限范围。任何其他方案上的客户端都会被拒绝授予该权限范围。同时授予它你希望玩家令牌携带的每一个权限范围,因为令牌只能持有你的客户端所持有的权限范围。embed:mint 本身绝不会交给玩家。
把客户端的 ID 和密钥保存在服务器的环境中,绝不要放进游戏或页面里。
注册你的 Web 源
网站小部件需要绑定到页面源的令牌。在控制台中,在客户端的设置里列出你的小部件运行的每一个源,例如 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。不会有任何内容迁移回访客。学习者也可以自己结束关联,方法是在“已连接的应用”中移除你的应用。