INTEGRATION MANUAL / V1

从授权到身份,
只需要两条请求。

浏览器负责跳转授权;你的服务器负责兑换一次性授权码。第三方凭据和 Client Secret 不会出现在前端。

10 分钟完成接入PHP / Node.js / PythonOAuth 风格授权码
01 / QUICKSTART

接入前准备

  1. 1
    创建应用

    在控制台保存应用名称和启用渠道。

  2. 2
    保存 Client Secret

    密钥只展示一次,只存放在你的服务端。

  3. 3
    登记回调地址

    协议、域名、路径和查询参数必须完全一致。

02 / AUTHORIZE

把用户送到授权入口

为每次登录生成新的随机 state,存入服务端会话。登录按钮可以指向:

GET https://login.zanekeji.com/oauth/authorize
  ?client_id=zl_xxxxxxxx
  &provider=qq
  &redirect_uri=https%3A%2F%2Fexample.com%2Fauth%2Fcallback
  &state=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
03 / TOKEN EXCHANGE

在服务端兑换稳定身份

回调收到 code 和原样的 state。确认 state 后,由服务端兑换身份:

POST https://login.zanekeji.com/api/v1/token
Content-Type: application/json

{
  "client_id": "zl_xxxxxxxx",
  "client_secret": "zls_xxxxxxxx",
  "code": "zlc_xxxxxxxx",
  "redirect_uri": "https://example.com/auth/callback"
}
{
  "ok": true,
  "data": {
    "subject_id": "sub_xxxxxxxxxxxxxxxx",
    "provider": "qq",
    "profile": { "nickname": "Zane", "avatar": "...", "email": "" },
    "issued_at": "2026-10-19T..."
  }
}

用 subject_id 登录你的本地用户。不要按昵称或邮箱自动合并不同渠道。

04 / WECHAT

微信无需单独接法

把 provider 换成 wechat。平台会生成小程序二维码,并通过现有赞恩小程序确认登录。前端只轮询平台的状态接口,不接触小程序密钥。

05 / BROWSER SDK

弹出登录窗口

<script src="https://login.zanekeji.com/sdk/zanelogin.js"></script>
<script>
ZaneLogin.open({
  clientId: 'zl_xxxxxxxx',
  provider: 'github',
  state: 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
}).then(({code, state}) => {
  // 把 code 和 state 发给你的后端兑换
});
</script>
06 / SECURITY

必须遵守的边界

✓ Client Secret 只放在服务端。

✓ 每次登录生成新的 state 并在回调时核对。

✓ 授权码五分钟有效且只能兑换一次。

✓ 回调地址使用精确匹配,不使用通配符。

✓ 失败信息返回给用户,内部错误留在平台日志。