https://auth.callzone.com.cn/oauth2/authorizehttps://auth.callzone.com.cn/oauth2/token| 参数名 | 说明 | 是否必填 |
|---|---|---|
| response_type | 固定为 code | ✅ |
| client_id | 应用的唯一标识 | ✅ |
| redirect_uri | 回调地址(需在应用配置中注册) | ✅ |
| scope | 请求的权限范围(如:openid profile offline_access , 其中 offline_access 用于控制发放刷新令牌) | ✅ |
| state | 防止CSRF攻击的随机字符串 | ✅ |
| code_challenge | 由 code_verifier 生成的摘要字符串 | ✅ |
| code_challenge_method | 摘要算法, 固定为 S256 | ✅ |
code_verifier 与 code_challengecode_verifier:长度 43~128 的随机字符串,可包含大小写字母、数字、-、_、.、~。code_challenge:对 code_verifier 进行 SHA256 哈希后,再进行 Base64 URL 安全编码。// 生成随机 code_verifier
function generateCodeVerifier() {
const array = new Uint8Array(64);
crypto.getRandomValues(array);
return Array.from(array, dec => ('0' + dec.toString(16)).substr(-2)).join('');
}
// 生成 code_challenge (S256)
async function generateCodeChallenge(verifier) {
const data = new TextEncoder().encode(verifier);
const digest = await crypto.subtle.digest('SHA-256', data);
const base64 = btoa(String.fromCharCode(...new Uint8Array(digest)))
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=+$/, '');
return base64;
}
// 使用示例
const code_verifier = generateCodeVerifier();
const code_challenge = await generateCodeChallenge(code_verifier);
console.log({ code_verifier, code_challenge });GET https://auth.callzone.com.cn/oauth2/authorize
?response_type=code
&client_id=your_client_id
&redirect_uri=https://yourapp.com/callback
&scope=openid%20profile
&state=xyzABC123
&code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
&code_challenge_method=S256https://yourapp.com/callback?code=SplxlOBeZQQYbYS6WxSbIA&state=xyzABC123https://yourapp.com/callback?error=access_denied&error_description=OAuth%202.0%20Parameter%3A%20client_id&error_uri=https%3A%2F%2Fdatatracker.ietf.org%2Fdoc%2Fhtml%2Frfc6749%23section-4.1.2.1&state=xyzABC123POST https://auth.callzone.com.cn/oauth2/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&
client_id=your_client_id&
code=SplxlOBeZQQYbYS6WxSbIA&
redirect_uri=https://yourapp.com/callback&
code_verifier=your_original_code_verifier{
"access_token": "2YotnFZFEjr1zCsicMWpAA",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA",
"scope": "openid profile"
}{
"sub": "1320700231385501697",
"website": null,
"zoneinfo": null,
"birthdate": null,
"gender": "1",
"profile": null,
"preferred_username": null,
"given_name": null,
"middle_name": null,
"locale": null,
"picture": "https://file.callzone.com.cn/1613776109755723778/1744859579277/v2-47fe87e767dbfad8670f71126096fe08_1440w.jpg",
"updated_at": null,
"name": null,
"nickname": null,
"family_name": null
}POST https://auth.callzone.com.cn/oauth2/token
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token&
refresh_token=tGzv3JOkF0XG5Qx2TlKWIA&
client_id=your_client_id{
"access_token": "NEW_ACCESS_TOKEN",
"token_type": "Bearer",
"expires_in": 3600
}code_verifier 暴露给授权服务器或第三方。state 参数进行校验,防止 CSRF 攻击。code_verifier。