先在通行证下申请应用
使用你的赞恩统一身份认证账号登录,然后进入 开发者应用,创建一个接入应用。应用创建后会得到:
可以出现在浏览器跳转链接中,不需要保密。
仅在创建或更换密钥时展示一次,只能保存在你的服务器。
每个应用单独维护,只有精确匹配的 HTTPS 地址可以接收授权结果。
这里的“应用密钥”是 OAuth 客户端密钥 Client Secret,不是用于其他系统的 SSH 私钥,也不应交给网页前端。
在你的授权回调地址核对 state
授权成功后,浏览器会回到白名单中的 redirect_uri,并附带:
https://你的网站/auth/zane/callback
?code=sso_一次性授权码
&state=发起登录时的原始随机值
- 1确认 state
与发起登录时保存在服务端会话中的值逐字比较。不一致时立即拒绝。
- 2保留 redirect_uri
兑换授权码时提交的地址必须与授权请求和白名单完全相同。
- 3只兑换一次
授权码五分钟有效,兑换成功后立即失效。
由服务器兑换稳定身份
浏览器拿到 code 后,把它发送给你的服务器。你的服务器再使用 Client Secret 请求赞恩统一身份认证:
POST https://sso.zanekeji.com/api/v1/token
Content-Type: application/json
{
"client_id": "你的_client_id",
"client_secret": "你的_client_secret",
"code": "回调收到的_sso_code",
"redirect_uri": "授权请求使用的同一个地址"
}
Client Secret 不应出现在浏览器代码中。不要把兑换请求直接交给前端执行。
使用 subject_id 作为稳定账号标识
{
"ok": true,
"data": {
"subject_id": "sso_123",
"provider": "zane_sso",
"profile": {
"username": "Zane",
"nickname": "沈家辉",
"email": "zane@example.com",
"phone": "",
"avatar": "https://...",
"legal_version": "2026-10-20.2",
"privacy_accepted_at": "2026-10-20 12:00:00",
"terms_accepted_at": "2026-10-20 12:00:00"
},
"issued_at": "2026-10-20T12:00:00+08:00"
}
}
请保存 subject_id 与本地用户账号的对应关系。不要根据昵称、头像或邮箱自动合并不同用户的账号;邮箱和手机号可能被用户更换。
接入必须满足的安全要求
✓ Client Secret 只保存在服务器,不写入网页、App 包、公开代码仓库或聊天记录。
✓ 每次登录生成新的随机 state,并在回调时由服务器核对。
✓ 回调地址必须使用 HTTPS,并已加入当前应用的授权回调白名单。
✓ 授权码只兑换一次,五分钟内有效,失败后重新发起完整登录。
✓ 生产环境不要接受任意跳转地址、通配符域名或未登记的子路径。
✓ 如果怀疑应用密钥泄露,应立即在开发者应用中更换密钥。
接入遇到问题?先核对 Client ID、密钥、state 和回调白名单。
打开开发者应用