callzone 开放接口平台
  1. OAuth2.0
callzone 开放接口平台
  • OAuth2.0
    • OAuth2 授权码模式
    • 获取微信公众号二维码
      POST
    • 检查登录码是否可用
      POST
    • 获取令牌
      POST
  • 开放接口
    • 开放平台接口说明
    • 表单数据
      • 提交数据
    • 组织管理
      • 获取当前成员信息
    • 视界
      • 设备渲染对接
      • 获取我的设备
      • 获取用户模板列表
      • 创建设备渲染任务
      • 获取设备渲染任务
  1. OAuth2.0

OAuth2 授权码模式

OAuth2 授权码模式(Authorization Code + PKCE)对接文档#

一、概述#

本文档说明如何通过 OAuth2.1 授权码模式(带 PKCE) 向授权服务器申请访问令牌(Access Token)。
授权端点(Authorize Endpoint):
https://auth.callzone.com.cn/oauth2/authorize
令牌端点(Token Endpoint):
https://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_challenge#

1. 生成逻辑#

code_verifier:长度 43~128 的随机字符串,可包含大小写字母、数字、-、_、.、~。
code_challenge:对 code_verifier 进行 SHA256 哈希后,再进行 Base64 URL 安全编码。

2. 伪代码示例(JavaScript)#

// 生成随机 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 请求:
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=S256
用户在授权页面同意后,授权服务器会重定向至:
https://yourapp.com/callback?code=SplxlOBeZQQYbYS6WxSbIA&state=xyzABC123
通过code 去授权服务令牌端点换取令牌
用户在授权页面拒绝授权,授权服务器会重定向至:
https://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=xyzABC123
通过判断参数 error 等于access_denied 处理拒绝授权逻辑,如 重新发起授权
error 目前可选值有
invalid_request(授权参数缺失或错误)
access_denied(用户或授权服务拒绝了授权)
invalid_grant(授权失效)
invalid_scope(授权 scope 不满足)

六、第二步:使用授权码换取访问令牌#

请求示例(POST)#

POST 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"
}

七、第三步:携带 Access Token 调用资源接口#

获取授权的用户信息 GET https://auth.callzone.com.cn/userinfo

示例请求#

响应示例#

{
    "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
}

八、刷新令牌(Refresh Token)#

请求:
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
}

九、安全建议#

1.
必须使用 HTTPS(示例为测试环境,可换为生产 HTTPS 域名)。
2.
不要将 code_verifier 暴露给授权服务器或第三方。
3.
Access Token 建议保存在内存中,不要长期缓存。
4.
对回调请求中 state 参数进行校验,防止 CSRF 攻击。
5.
每次授权都应重新生成新的 code_verifier。
下一页
获取微信公众号二维码
Built with