无密码授权
本指南说明如何通过您的游戏应用实现玩家授权,让玩家无需手动输入玩家 ID 即可无缝访问游戏枢纽。


流程的两种发起方式
同一个 用户授权 端点支持两种方式,选择哪一种决定了是否需要 nonce:
- 由枢纽发起(二维码 / 登录按钮)。 玩家位于游戏枢纽中;游戏枢纽显示二维码或登录按钮,生成一个
nonce,并通过以该nonce为键的 WebSocket 等待登录。下文逐步介绍的就是这一流程。 - 由游戏发起("前往枢纽"按钮)。 玩家从您的游戏应用开始,您将其以已授权状态送入枢纽。使用同一个 S2S 调用,但省略
nonce,并由您自己打开返回的authorization_url。请参阅 由游戏发起的登录。
前提条件
- 用于请求身份验证的活跃服务器到服务器 (S2S) API Key。
- 在阿哈利姆控制台的 Customization → Login 中配置的 Deep Link URL(见下文)。仅由枢纽发起的流程需要。
配置 Deep Link URL
Deep Link URL 是玩家点击登录按钮时游戏枢纽打开的地址。请在阿哈利姆控制台的 Customization → Login → Deep Link URL 中进行设置。
这与 游戏 → 枢纽深层链接 方向相反:在那里,您的游戏打开一个进入枢纽的链接(/go/login?player_id=…);而在这里,枢纽打开一个进入您游戏的链接来授权玩家。
游戏枢纽会自动在此 URL 后附加 after_auth 和 nonce 查询参数,您无需自行添加占位符。例如,配置的值 https://your-game-server.com/authorize-player 在枢纽打开时会变为 https://your-game-server.com/authorize-player?after_auth=open_authorization_url&nonce=<value>。您在配置的 URL 中包含的任何固定查询参数都会保留。
请使用由您自己的域名处理的 https:// Android App Link / iOS Universal Link(例如 https://your-game-server.com/authorize-player),而不是 mygame://authorize-player 这样的自定义 scheme。
当游戏应用未安装时,这一选择就很重要,例如玩家在移动浏览器中打开枢纽:
- 自定义 scheme(
mygame://…)没有操作系统层面的回退。如果设备上没有任何应用处理该 scheme,浏览器什么也不做,玩家会一直停留在加载动画上。您的apple-app-site-association和assetlinks.json文件不适用于自定义 scheme。 - https App Link / Universal Link 会自动回退:已安装应用时由操作系统打开应用,否则浏览器会正常加载该 https URL。将该 URL 指向您服务器上的一个端点,在应用缺失时把玩家重定向到您希望的位置(例如网页商店),这样玩家就不会卡住。
要启用 App Links / Universal Links,请在 Deep Link URL 所用的域名上托管 assetlinks.json(Android)和 apple-app-site-association(iOS),并让您的应用声明对应的路径。
第 1 步:在游戏客户端中拦截授权深层链接
当玩家点击登录按钮时,游戏枢纽会打开附加了 after_auth 和 nonce 的 Deep Link URL。URL 将采用以下格式:
https://your-game-server.com/authorize-player?after_auth=open_authorization_url&nonce=<value>
这里,<value> 是游戏枢纽为每个授权请求生成的唯一字符串,after_auth 告诉游戏客户端在 第 4 步 中该做什么。
游戏客户端(或在应用未安装、无法处理 https App Link 时由您的服务器)必须拦截深层链接,并按名称而不是按位置从 URL 中读取 nonce 和 after_auth。此 nonce 将用于向游戏后端的授权请求。
第 2 步:将授权请求转发到游戏后端
玩家启动授权会话后,游戏客户端应向游戏后端发送授权请求。
第 3 步:向阿哈利姆发送授权请求
收到游戏客户端的请求后,游戏后端必须使用 用户授权 端点向阿哈利姆 API 发送 POST 请求。在请求中包含以下参数:
| 参数 | 描述 | 是否必需 |
|---|---|---|
player_id | 要授权的玩家唯一标识符。 | 是 |
nonce | 游戏枢纽提供的唯一字符串。由枢纽发起的流程中必需;由游戏发起的登录 中请省略。 | 视情况 |
redirect_path | 要将玩家重定向到的游戏枢纽页面。 | 否 |
player_info | 首次授权时写入的可选玩家资料。可包含 name、avatar_url、attributes 和 custom_attributes。 | 否 |
nonce 将授权与正在等待的枢纽会话关联起来,正是它让显示二维码 / 登录按钮的枢纽能够通过 WebSocket 完成登录。当您的游戏自己打开 authorization_url 时请省略它(请参阅 由游戏发起的登录)。
请求示例
curl --request POST \
--url https://api.aghanim.com/s2s/v1/users/authorize \
--header 'Authorization: Bearer YOUR_S2S_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"player_id": "2D2R-OP3C",
"nonce": "N2Q3Y2MGI6bQ",
"player_info": {
"name": "Han Solo",
"avatar_url": "https://example.com/han.png",
"attributes": { "hard_currency_amount": 500 },
"custom_attributes": { "faction": "rebel" }
}
}'
响应示例
{
"authorization_url": "https://your-game-hub/go/login?token=dXNyX...FTV0xqTWg&nonce=N2Q3Y2MGI6bQ"
}
第 4 步:将玩家重定向到授权 URL
游戏后端收到来自阿哈利姆的 authorization_url 后,应将该 URL 传回游戏客户端。游戏客户端应启动默认浏览器并打开授权 URL。此操作完成玩家在游戏枢纽上的授权。
只有当登录是从添加到 iOS 主屏幕的游戏枢纽发起时,游戏枢纽才会发送 after_auth=prompt_open_pwa;其他所有登录都会收到 open_authorization_url。对于 prompt_open_pwa,请不要打开授权 URL,而是显示一条消息,请玩家返回游戏枢纽应用:应用会自行完成登录。
由游戏发起的登录
当玩家从您的游戏应用开始,而您希望将其以已登录状态直接送入枢纽(例如"前往枢纽"按钮),而不是由枢纽打开您的应用时,请使用此方式。它使用同一个 用户授权 端点,与上述流程有两点不同:跳过深层链接拦截(第 1–2 步),并省略 nonce。
- 玩家点击游戏内的按钮。
- 您的游戏后端仅使用
player_id(以及可选的redirect_path)调用POST /s2s/v1/users/authorize,不带nonce。 - 阿哈利姆返回形如
https://your-game-hub/go/login?token=…的authorization_url。 - 将该 URL 传回游戏客户端,并在设备的默认浏览器中打开。URL 中的
token会让玩家登录枢纽。
注意:
- 这一方向不需要配置 Deep Link URL,并且无论启用了哪些网页登录方式都能正常工作,您无需在枢纽上启用 "Login with Player Id" 方式。这样可以把枢纽自身的登录界面限制为单一方式(例如二维码),同时仍能直接从游戏中让玩家登录。
- 由于没有枢纽会话在 WebSocket 上等待,也就没有需要用
nonce关联的对象,以nonce为键的 拒绝授权 调用也不适用。如果您的游戏判定某个玩家不能登录,只需不打开authorization_url即可。
处理授权失败
游戏并不总能授权玩家。例如,玩家尚未达到访问游戏枢纽所需的等级,或账号受到限制。在这些情况下,请告知阿哈利姆登录无法继续,以免玩家一直停留在加载动画上等待。