通过 OAuth 2.0 授权码模式,让用户用 Naicha 账号登录你的产品。
App ID 与 App Secret(Secret 只显示一次,请保存到后端)。App ID;App Secret 在详情页仅显示一次,请立即保存到后端环境变量,切勿写进前端代码或客户端安装包。| 接口 | 方法 | 说明 |
|---|---|---|
| /oauth/authorize | GET | 网页授权入口(302 跳转,支持 code_challenge / scope) |
| /oauth/token | POST | code + app_secret(或 code_verifier / PKCE)换 access_token |
| /api/oauth/userinfo | GET | Bearer token 拉取用户信息(按 scope 过滤字段) |
| /api/oauth/validate | POST | 校验 token 有效性(含封禁/停用状态) |
| /api/oauth/revoke | POST | 撤销 token |
| /api/oauth/qr/start | POST | 桌面扫码登录:申请扫码会话,返回 scan_id + qr_url |
| /oauth/qr/:scan_id | GET | 手机扫码后的确认页(登录 + 确认授权) |
| /api/oauth/qr/:scan_id/status | GET | 桌面端轮询:confirmed 时返回一次性 code |
scope 参数(空格分隔,可选):login(默认:用户名/昵称/头像)· email(+邮箱)· phone(+手机号)· profile(全部资料)
| 参数 | 必填 | 说明 |
|---|---|---|
| app_id | 是 | 你的应用 App ID |
| redirect_uri | 是 | 授权回调地址,必须与申请时填写一致(协议/端口/路径完全匹配,或命中回调域名白名单) |
| state | 建议 | 随机字符串,回调时原样返回,用于防 CSRF 伪造回跳 |
| scope | 否 | 权限范围,空格分隔,如 login email |
| code_challenge | PKCE 时 | PKCE 的 S256 摘要(App/桌面端必用,可免 secret) |
| code_challenge_method | PKCE 时 | 固定 S256 |
| 参数 | 必填 | 说明 |
|---|---|---|
| app_id | 是 | 应用 App ID |
| app_secret | 授权码模式 | 应用密钥(仅服务端调用;PKCE 流程传 code_verifier 可省略) |
| code | 是 | 授权码,一次性,10 分钟内有效 |
| code_verifier | PKCE 时 | 生成 code_challenge 时使用的原始随机串 |
POST /oauth/token
→ 200 {
"ok": true,
"access_token": "eyJhbGciOiJIUzI1NiJ9.xxxx",
"token_type": "Bearer",
"expires_in": 2592000, // 有效期秒数,默认 30 天(平台可配置)
"scope": "login email",
"user": {
"uid": 10001, // 用户唯一 ID,跨所有接入应用一致
"username": "demo",
"nickname": "演示用户",
"avatar": "https://.../avatar.png",
"email": "demo@naicha.cloud" // 仅授权 email/phone/profile 时出现
}
}之后调用 /api/oauth/userinfo 时,请求头带 Authorization: Bearer <access_token>。
| 字段 | 类型 | 说明 |
|---|---|---|
| uid | number | 用户唯一 ID(跨应用一致,可用作本地用户主键) |
| username | string | 登录名(唯一) |
| nickname | string | 昵称(未设置时等于 username) |
| avatar | string | 头像 URL(可能为空,为空请展示默认头像) |
| string | 仅授权 email / profile 时返回 | |
| phone | string | 仅授权 phone / profile 时返回 |
→ 400 { "ok": false, "error": "回调地址不在白名单", "code": 400 }
→ 401 { "ok": false, "error": "token 无效或已过期", "code": 401 }// 点击「使用 Naicha 账号登录」
const state = Math.random().toString(36).slice(2); // 防 CSRF,存会话
location.href = 'https://账号中心域名/oauth/authorize?app_id=YOUR_APP_ID'
+ '&redirect_uri=' + encodeURIComponent('https://yoursite.com/oauth/cb')
+ '&state=' + state;// Node.js(Express)示例
const code = req.query.code; // 一次性授权码
const r = await fetch('https://账号中心域名/oauth/token', {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify({ app_id: 'YOUR_APP_ID', app_secret: 'YOUR_SECRET', code }),
});
const { access_token, user } = await r.json();
// user = { uid, username, nickname, avatar };建立你的本地登录态即可import requests
r = requests.post('https://账号中心域名/oauth/token', json={
'app_id': 'YOUR_APP_ID', 'app_secret': 'YOUR_SECRET', 'code': code})
token = r.json()['access_token']
user = requests.get('https://账号中心域名/api/oauth/userinfo',
headers={'Authorization': 'Bearer ' + token}).json()resp, _ := http.PostForm("https://账号中心域名/oauth/token", url.Values{
"app_id": {"YOUR_APP_ID"}, "app_secret": {"YOUR_SECRET"}, "code": {code},
})
var d struct{ AccessToken string `json:"access_token"` }
json.NewDecoder(resp.Body).Decode(&d)
// 用 d.AccessToken 调 /api/oauth/userinfo 拉用户POST /api/oauth/validate { "app_id","app_secret","token" }
→ { ok:true, valid:true, user:{...} } // 用户被封禁 / 应用被禁用时返回错误,请将用户踢下线| 客户端类型 | 授权方式 | 状态 |
|---|---|---|
| 网站(Web) | 授权码(重定向)+ scope | ✅ 可用 |
| 移动 App / 桌面软件 | PKCE 授权(免 secret) | ✅ 可用 |
| 桌面 / 无浏览器设备 | 扫码登录(二维码确认) | ✅ 可用 |
| 小程序 | webview 授权 / openid 绑定 | 🚧 规划中(P5) |
网站、App/桌面(PKCE)、桌面扫码三种接入方式均已上线,按上方标签页查看对应示例代码。
回调地址校验失败? 确认 redirect_uri 与开放平台配置的回调地址完全一致(含协议/端口/路径),或命中回调域名白名单。
Secret 忘了? 在应用详情「重新生成」,旧 Secret 立即失效。
用户被封禁/应用被禁用? 调用 validate 会返回错误,你的站点应将该用户踢下线。
怎么让用户免登录? 账号中心保持登录态,用户再次点登录会自动回跳,无需输密码。
| error 字段(中文) | HTTP | 出现场景 / 处理 |
|---|---|---|
| 应用不存在或未审核通过 | 400/404 | App ID 错误,或应用仍在审核中 / 被禁用 |
| 回调地址不在白名单 | 400 | redirect_uri 与申请时填写不一致,或域名未加入白名单 |
| 授权码无效或已过期 | 400 | code 被重复使用 / 超过 10 分钟,重新走授权流程 |
| 授权码与应用不匹配 | 400 | code 不是该 app_id 签发,检查 app_id 是否填对 |
| app_secret 不正确 | 400 | Secret 填错;PKCE 流程不要传 app_secret |
| code_verifier 校验失败 | 400 | PKCE 的 verifier 与 authorize 时的 challenge 不匹配 |
| token 无效或已过期 | 401 | token 过期 / 已撤销,重新换取 token |
| 用户不存在或被封禁 | 401/403 | 用户已注销或封禁,请将该用户踢下线 |
| 应用已停用 / 应用凭据不正确 | 401 | 应用被禁用,或 validate 时凭据错误 |
| 操作过于频繁,请稍后再试 | 429 | 触发限流,稍后重试 |
| 未登录 | 401 | 桌面扫码确认等需要登录的场景,引导用户先登录 |
所有接口错误统一返回 {"ok":false, "error":"中文描述", "code":HTTP状态码},用 ok 字段判断成败即可。
/api/oauth/validate,token 失效或用户被封禁时立即踢下线。欢迎使用 NaichaIDaaS(以下简称"本服务")。本服务由 Naicha 开放平台运营。在使用本服务前,请您仔细阅读并充分理解本协议全部条款。您完成注册、登录或使用本服务,即视为您已阅读并同意受本协议约束。
生效日期:2026 年 8 月 28 日
我们高度重视您的个人信息保护。本指引说明我们如何收集、使用、存储、共享与保护您的个人信息,以及您享有的权利。
生效日期:2026 年 8 月 28 日