复制提示词发送给 AI,即可自动编写OAuth2.0 接入代码
OAuth2.0 接入文档
CZL Connect 提供标准 OAuth 2.0 Authorization Code 授权流程。
在 CZL Connect 后台,客户端认证方式统一为两类:
secretnone
其中 secret 客户端在协议层同时兼容 client_secret_basic 与 client_secret_post 两种标准传参方式。
当客户端认证方式为 none 时,授权码交换必须使用 PKCE。
适用范围
| 客户端类型 | 推荐认证方式 |
|---|---|
| 服务端 Web 应用 | secret |
| 桌面端应用 | none + PKCE |
| 移动端应用 | none + PKCE |
| SPA / 浏览器前端 | none + PKCE |
服务端应用可以安全保存 client_secret。
桌面端、移动端和浏览器前端无法将 client_secret 视为机密,应使用 PKCE。
认证方式
secret
CZL Connect 的 secret 客户端兼容以下两种标准 OAuth2 传参方式。
client_secret_basic
客户端通过 HTTP Basic 认证发送 client_id 与 client_secret。
Authorization: Basic BASE64(CLIENT_ID:CLIENT_SECRET)
client_secret_post
客户端通过 application/x-www-form-urlencoded 请求体发送 client_id 与 client_secret。
client_id=YOUR_CLIENT_ID
client_secret=YOUR_CLIENT_SECRET
none
客户端不发送 client_secret。
此模式下必须使用 PKCE。
PKCE
PKCE 适用于无法安全保存 client_secret 的客户端。
流程要求如下:
- 客户端生成高强度随机字符串
code_verifier - 客户端计算
code_challenge = BASE64URL(SHA256(code_verifier)) - 授权请求携带
code_challenge与code_challenge_method=S256 - 令牌请求携带
code_verifier
CZL Connect 当前仅支持 S256。
端点
| 端点 | URL |
|---|---|
| 授权端点 | https://connect.czl.net/oauth2/authorize |
| 令牌端点 | https://connect.czl.net/api/oauth2/token |
| 用户信息端点 | https://connect.czl.net/api/oauth2/userinfo |
| 用户邮箱端点 | https://connect.czl.net/api/oauth2/user/emails |
授权请求
基本参数
| 参数 | 必填 | 说明 |
|---|---|---|
response_type | 是 | 固定为 code |
client_id | 是 | 应用的客户端 ID |
redirect_uri | 是 | 回调地址 |
scope | 否 | 授权范围 |
state | 否 | 客户端状态参数,建议始终提供 |
upstream_providers | 否 | 限制可用上游认证方式,逗号分隔 |
code_challenge | PKCE 时必填 | PKCE challenge |
code_challenge_method | PKCE 时必填 | 固定为 S256 |
Traditional Client
https://connect.czl.net/oauth2/authorize?
response_type=code
&client_id=YOUR_CLIENT_ID
&redirect_uri=YOUR_REDIRECT_URI
&scope=read
&state=RANDOM_STATE_VALUE
Public Client + PKCE
https://connect.czl.net/oauth2/authorize?
response_type=code
&client_id=YOUR_CLIENT_ID
&redirect_uri=YOUR_REDIRECT_URI
&scope=read
&state=RANDOM_STATE_VALUE
&code_challenge=YOUR_CODE_CHALLENGE
&code_challenge_method=S256
令牌请求
授权码换取令牌
secret 客户端: client_secret_post
POST https://connect.czl.net/api/oauth2/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&code=AUTHORIZATION_CODE
&client_id=YOUR_CLIENT_ID
&client_secret=YOUR_CLIENT_SECRET
&redirect_uri=YOUR_REDIRECT_URI
secret 客户端: client_secret_basic
POST https://connect.czl.net/api/oauth2/token
Content-Type: application/x-www-form-urlencoded
Authorization: Basic BASE64(YOUR_CLIENT_ID:YOUR_CLIENT_SECRET)
grant_type=authorization_code
&code=AUTHORIZATION_CODE
&redirect_uri=YOUR_REDIRECT_URI
none + PKCE
POST https://connect.czl.net/api/oauth2/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&code=AUTHORIZATION_CODE
&client_id=YOUR_CLIENT_ID
&redirect_uri=YOUR_REDIRECT_URI
&code_verifier=YOUR_CODE_VERIFIER
响应示例
{
"access_token": "ACCESS_TOKEN",
"token_type": "bearer",
"refresh_token": "REFRESH_TOKEN",
"expires_in": 86400,
"scope": "read"
}
刷新令牌
secret 客户端: client_secret_post
POST https://connect.czl.net/api/oauth2/token
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token
&refresh_token=REFRESH_TOKEN
&client_id=YOUR_CLIENT_ID
&client_secret=YOUR_CLIENT_SECRET
secret 客户端: client_secret_basic
POST https://connect.czl.net/api/oauth2/token
Content-Type: application/x-www-form-urlencoded
Authorization: Basic BASE64(YOUR_CLIENT_ID:YOUR_CLIENT_SECRET)
grant_type=refresh_token
&refresh_token=REFRESH_TOKEN
none
POST https://connect.czl.net/api/oauth2/token
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token
&refresh_token=REFRESH_TOKEN
&client_id=YOUR_CLIENT_ID
用户信息
请求
GET https://connect.czl.net/api/oauth2/userinfo
Authorization: Bearer ACCESS_TOKEN
响应
{
"id": 1,
"username": "zhangsan",
"nickname": "张三",
"email": "zhangsan@gmail.com",
"avatar": "https://example.com/avatar.png",
"groups": "t0,t1,t2,t3,t4,t5,viewer,admin",
"upstreams": []
}
字段
| 字段 | 说明 |
|---|---|
id | 用户 ID |
username | 用户名 |
nickname | 用户昵称 |
email | 用户邮箱 |
avatar | 用户头像 URL |
groups | 用户分组字段,包含继承展开后的分组值 |
upstreams | 用户绑定的上游账号信息 |
用户邮箱接口
请求
GET https://connect.czl.net/api/oauth2/user/emails
Authorization: Bearer ACCESS_TOKEN
响应
[
{
"email": "zhangsan@gmail.com",
"verified": true,
"primary": true,
"visibility": "public"
}
]
上游认证限制
upstream_providers 用于限制授权流程中可用的上游认证方式。
https://connect.czl.net/oauth2/authorize?
response_type=code
&client_id=YOUR_CLIENT_ID
&redirect_uri=YOUR_REDIRECT_URI
&scope=read
&state=RANDOM_STATE_VALUE
&upstream_providers=discourse,github
常见取值包括:
discoursegithubgoogleqqwechat
迁移到 PKCE
从传统 client_secret 模式迁移到 PKCE 时,通常只需要修改以下内容:
- 在 CZL Connect 后台将客户端认证方式改为
none - 授权请求增加
code_challenge与code_challenge_method=S256 - 令牌请求删除
client_secret - 令牌请求增加
code_verifier
用户信息接口、回调地址、scope 和授权端点不需要调整。
安全要求
client_secret仅适用于能够安全保存机密的服务端应用- 桌面端、移动端和浏览器前端不应内置
client_secret - Public Client 必须使用 PKCE
state应始终由客户端生成并校验- 客户端仍需妥善保存
access_token与refresh_token - 当前仅支持
S256
应用更新推送
如果你的应用已经通过 OAuth2 接入 CZL Connect,还可以直接启用“更新推送”能力:
- 客户端检查更新时,继续使用当前应用登录后得到的
access_token - 不需要也不应该在客户端内嵌
client_secret - 安装包下载通过短时票据保护
- CI / 服务端自动发布版本时,使用独立的 Push Token
详细说明见: