跳转到内容

Connect 流程

查看 Markdown

本页讲解 Connect 协议:当应用希望直接控制浏览器登录往返时使用的 Sudomimus 流程。Connect 走 JSON over HTTPS,任何带 HTTP 客户端的后端语言都能使用;下面给出 curl、Node.js、Python、Go 四种示例。

如果你做的是原生客户端(桌面、游戏、CLI),见 原生客户端。如果走 OIDC,见 OIDC 接入方

Tab 全页同步:选一次语言,下面所有代码块都会跟随切换。

阶段发起方端点结果
1. Establish应用后端connect-api POST /establish{ exposureKey, hiddenKey }
2. Authenticate浏览器via.sudomimus.com用户完成一项允许的认证挑战
3. Redeem应用后端connect-api POST /redeem{ accessToken, refreshToken }
4. Refresh应用后端connect-api POST /refresh新 access token 与轮换后的 refresh token

三个参与方各自承担不同责任:

  • 应用后端签名 /establish、保存 hiddenKey、兑换已完成的 inquiry,并验证最终令牌。
  • 浏览器exposureKey 带到托管认证界面,但永远看不到 hiddenKey
  • via.sudomimus.com执行通行密钥、邮箱验证码、OAuth 或联合登录挑战,只有认证成功后才创建 confirmationKey

这套生命周期只属于 Connect。OIDC 使用 authorization code + PKCE;原生 direct-issue 则在一次请求中交换 Steam ticket 或 AccessKey。

后端请求 Connect 开启一次认证会话。返回里会同时给出 exposure key(要传给浏览器)和 hidden key(留在服务器)。

Terminal window
curl -X POST https://connect-api.sudomimus.com/establish \
-H "Content-Type: application/json" \
-H "Authorization: SudomimusClientJWT $SUDOMIMUS_CLIENT_AUTH_JWT" \
-d '{
"applicationAnchor": "your-application",
"returnMethods": [
{
"type": "CALLBACK",
"payload": { "callbackUrl": "https://your-app.com/auth/callback" }
}
]
}'

hiddenKey 与用户的 pending session 绑定存到服务端,然后用 URL 里带上 exposureKey 把用户跳转到 via.sudomimus.com

2. Authenticate —— 交给 via.sudomimus.com

Section titled “2. Authenticate —— 交给 via.sudomimus.com”

把用户浏览器跳转到 via.sudomimus.com,URL 里带上 exposure key。用户在那里完成通行密钥或邮箱验证码挑战。

# 不发 HTTP —— 你的应用做一次 302:
Location: https://via.sudomimus.com/?exposure-key=<exposureKey>

用户完成挑战后,via.sudomimus.com 会将浏览器跳转回 callbackUrl,并在 URL 中附带 exposure-keyconfirmation-key 两个查询参数。

在回调处理程序中,将三个密钥一并提交给 Connect,换取访问令牌和刷新令牌。

Terminal window
curl -X POST https://connect-api.sudomimus.com/redeem \
-H "Content-Type: application/json" \
-d '{
"exposureKey": "...",
"hiddenKey": "...",
"confirmationKey": "..."
}'

access token 是一个签名后的 JWT。验签时使用应用的 token-signing 公钥(从 POST /info 拉一次后缓存),即可信任其 claim。完整流程(包括 kty: "Access" header 检查)见 令牌与验证

在 access token 过期前,用 refresh token 换取一个新的 access token 和一个新的 refresh token/refresh 需要 client-auth JWT。refresh token 会被轮换 —— 你提交的令牌被消费,响应里返回它的替代者。请存下新的 refreshToken 并在下一次刷新时使用它;重复使用已经用过的令牌会导致整个会话被吊销。对同一个令牌近乎同时的并发刷新(例如多个标签页)会被容忍并收敛到同一个会话;只有在替代令牌签发之后再复用才会吊销它。

Terminal window
curl -X POST https://connect-api.sudomimus.com/refresh \
-H "Content-Type: application/json" \
-d '{ "refreshToken": "..." }'

会话内省、登出、账户级吊销见 管理会话

POST /info 根据 anchor 返回某个应用的公开资料(名称、公钥、本地化名称)。它需要 client-auth JWT,可以从浏览器或其他不可信上下文中调用。

Terminal window
curl -X POST https://connect-api.sudomimus.com/info \
-H "Content-Type: application/json" \
-d '{ "applicationAnchor": "your-application", "locale": "zh-CN" }'

/info 返回的 applicationPublicKey 就是应用后端用于验证 access token 的密钥。请缓存它,仅在密钥轮换后重新拉取。