OAuth 授权流程

采用 RFC 6749 授权码模式(Authorization Code),并支持 RFC 7636 PKCE。整体四步:引导授权 → 拿到 code → 换取 token → 调用资料接口。

1. 引导用户到授权页

在你的应用里打开如下地址(Android 用 Custom Tabs,iOS 用 ASWebAuthenticationSession,Web 用当前页跳转):

https://open.jintuzi.com/oauth/authorize
  ?response_type=code
  &client_id=你的_app_id
  &redirect_uri=https%3A%2F%2Fyour-app.com%2Fcallback
  &scope=user:avatar%20user:nickname%20user:jintuzi_no
  &state=随机防伪串
  &code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
  &code_challenge_method=S256
参数必填说明
response_type是固定 code
client_id是应用详情页的 AppID
redirect_uri是必须与后台登记的回调地址完全一致
scope是空格分隔,取值见字段定价;不能超出应用被允许的范围
state建议原样回传,用于防 CSRF,最长 200 字符
code_challenge公开客户端必填PKCE 的 S256 摘要(43~128 位 verifier 的 SHA-256,base64url 无填充)
code_challenge_method同上固定 S256

2. 用户同意后回调

https://your-app.com/callback?code=J8s...&state=随机防伪串

用户点「拒绝」时回调为 ?error=access_denied&state=...。请务必校验 state 与自己发起时一致。

3. 用 code 换 token

curl -X POST 'https://open.jintuzi.com/oauth/token' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'grant_type=authorization_code' \
  -d 'code=J8s...' \
  -d 'redirect_uri=https://your-app.com/callback' \
  -d 'client_id=你的_app_id' \
  -d 'client_secret=你的_app_secret' \
  -d 'code_verifier=原始随机串'

返回:

{
  "access_token": "jz_at_...",
  "token_type": "Bearer",
  "expires_in": 7200,
  "refresh_token": "jz_rt_...",
  "scope": "user:avatar user:nickname user:jintuzi_no"
}

4. 刷新令牌

curl -X POST 'https://open.jintuzi.com/oauth/token' \
  -d 'grant_type=refresh_token' \
  -d 'refresh_token=jz_rt_...' \
  -d 'client_id=你的_app_id' \
  -d 'client_secret=你的_app_secret'

每次刷新都会返回新的 refresh_token,旧的立即失效。请把新值持久化;若旧值被再次使用,平台会撤销该用户在该应用下的全部令牌,并要求用户重新授权。

5. 获取资料

curl 'https://open.jintuzi.com/oauth/userinfo' \
  -H 'Authorization: Bearer jz_at_...'
授权页是标准页,不要自己画

授权页由平台托管(含用户登录、字段与价格展示、同意/拒绝),第三方应用不得仿制或诱导用户输入金兔子账号密码。