OAuth 对外授权 · 接入指引

新手引导与接入文档,帮助开发者快速接入 OAuth2.0 授权码流程

概述

本服务支持作为 OAuth2.0 身份提供者(IdP),对外提供授权码(Authorization Code)流程。第三方应用可引导用户到本平台完成登录与授权,并使用返回的授权码换取 access_token,从而安全地访问用户身份信息(如 /api/auth/me)。

适用场景: 你的网站/应用需要「使用本平台账号登录」、获取用户昵称/邮箱等基础信息,或在此基础上扩展单点登录(SSO)、开放平台等能力。

快速开始(三步)

  1. 注册 OAuth 应用:登录控制台 →「OAuth 应用管理」→ 新建应用,填写应用名称与回调地址(redirect_uri)。
  2. 引导用户授权:在你的站点构造授权链接,让用户点击后跳转到本服务的授权端点;用户登录并同意后,将带着授权码(code)重定向回你的回调地址。
  3. 用授权码换 Token:在你的后端用 code、client_id、client_secret、redirect_uri 请求 Token 端点,获得 access_token;之后即可携带该 token 调用用户信息等接口。

下方将按步骤详细说明参数、示例与注意事项。

第一步:注册 OAuth 应用

使用本平台账号登录后,进入 控制台 → OAuth 应用管理,点击「新建应用」。

  • 应用名称:便于你识别的名称,如「我的网站」。
  • 回调地址(redirect_uri):用户授权完成后跳转的 URL,必须与你在代码里使用的地址完全一致(含协议、域名、路径、端口)。可配置多个,每行一个或逗号分隔。
  • Scope:默认 openid profile email,表示可请求用户身份、昵称、邮箱等。
  • 公开客户端:若为纯前端 SPA、无法安全保管 client_secret,可勾选「公开客户端」;否则请妥善保管创建后仅显示一次的 Client Secret。

创建成功后,你将获得 Client ID(必用)和 Client Secret(机密客户端必用,仅展示一次,请立即保存)。

第二步:引导用户授权

在你的网站放置「使用 XXX 登录」等按钮,点击后跳转到本服务的授权端点。若用户未登录,会先进入登录页,登录后再完成授权并重定向回你的 redirect_uri

授权端点

GET https://auth.ncvic.com/api/oauth/authorize

必填与常用参数

参数必填说明
client_id应用 Client ID
redirect_uri授权后跳转地址,须与注册时完全一致
response_type固定为 code
scope权限范围,默认 openid profile email
state建议防 CSRF,回调时原样带回,请校验
code_challengePKCE 用,可选;当前服务端仅存储,换 Token 时暂不校验 code_verifier
code_challenge_methodPKCE 用,如 S256

若参数错误、客户端无效或 redirect_uri 不在白名单,将重定向到本站错误页(/auth/error),展示友好提示,而非返回 JSON。

示例:构造授权链接

const authUrl = new URL('https://auth.ncvic.com/api/oauth/authorize');
authUrl.searchParams.set('client_id', '你的_client_id');
authUrl.searchParams.set('redirect_uri', 'https://你的站点.com/callback');
authUrl.searchParams.set('response_type', 'code');
authUrl.searchParams.set('scope', 'openid profile email');
authUrl.searchParams.set('state', randomState); // 建议生成随机字符串并存入 session
window.location.href = authUrl.toString();

用户同意后,将重定向到:
redirect_uri?code=授权码&state=你传入的state
授权码一次性有效,约 10 分钟内使用,且只能使用一次。

第三步:用授权码换取 access_token

在你的后端服务从回调 URL 中取出 codestate,校验 state 后,用 code 向 Token 端点发起 POST 请求(不要在前端暴露 client_secret)。

Token 端点

POST https://auth.ncvic.com/api/oauth/token

Content-Type: application/x-www-form-urlencoded

请求体参数

参数必填说明
grant_type固定为 authorization_code
code回调中的授权码
client_id应用 Client ID
client_secret机密客户端必填应用 Client Secret(公开客户端不传)
redirect_uri须与授权请求时使用的 redirect_uri 一致

示例:curl 换取 Token

curl -X POST 'https://auth.ncvic.com/api/oauth/token' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'grant_type=authorization_code' \
  -d 'code=回调中的授权码' \
  -d 'client_id=你的_client_id' \
  -d 'client_secret=你的_client_secret' \
  -d 'redirect_uri=https://你的站点.com/callback'

成功响应示例

{
  "access_token": "eyJhbGciOiJIUzI1NiIs...",
  "token_type": "Bearer",
  "expires_in": 2592000,
  "scope": "openid profile email"
}

expires_in 单位为秒,具体值由服务端配置(SESSION_MAX_AGE)决定。

之后在请求用户信息等接口时,在 Header 中携带:
Authorization: Bearer <access_token>
例如获取当前用户信息:GET https://auth.ncvic.com/api/auth/me

Scope 说明

本服务默认支持以下 scope(可空格分隔组合):

  • openid:用户唯一标识(sub)
  • profile:昵称、头像等资料
  • email:邮箱地址

创建应用时可配置该应用允许的 scope;授权与换 Token 时请求的 scope 不应超出应用配置范围。

注意事项

  • redirect_uri:授权请求与 Token 请求中的 redirect_uri 必须与注册应用时填写的某一项完全一致(包括协议、域名、路径、端口、大小写)。
  • 授权码一次性:每个 code 只能使用一次,且有效期为约 10 分钟,请及时换取 token。
  • client_secret 保密:仅在后端使用,不要写入前端代码或公开仓库。若泄露,请在应用管理中重置(若支持)或禁用该应用。
  • state 防 CSRF:建议生成随机 state 并存入 session/cookie,回调时校验与发起时一致。
  • 应用状态:若应用被禁用,授权与换 Token 将失败,请在控制台确认应用为「启用」状态。

常见问题

Q:回调时报 redirect_uri 不在白名单?
A:会跳转到本站错误页并提示「该应用的回调地址未通过安全校验」。请确认授权链接与 Token 请求中的 redirect_uri 与在「OAuth 应用管理」中配置的回调地址完全一致(含 https/http、末尾斜杠等)。
Q:换 Token 时提示授权码无效或已使用?
A:授权码只能使用一次,且约 10 分钟有效。请确认未重复使用、未超时,且换 Token 时的 redirect_uri 与授权时一致。
Q:纯前端 SPA 如何安全接入?
A:创建应用时勾选「公开客户端」,不传 client_secret。换 Token 必须通过你的后端代理请求(不可在前端暴露 client_secret)。授权时可传 code_challenge/code_challenge_method,当前服务端仅做存储,换 Token 时暂不校验 code_verifier,后续版本将支持完整 PKCE。
Q:如何管理已授权用户?
A:在「OAuth 应用管理」中进入对应应用,点击「已授权账户」可查看曾授权的用户列表,并支持撤销单个或全部授权。

授权码流程概览

1. 用户在你的站点点击「使用 XXX 登录」 2. 浏览器跳转到本服务:GET /api/oauth/authorize?client_id=...&redirect_uri=...&response_type=code&state=... 3. 若未登录 → 先登录;登录后完成授权 4. 本服务重定向到你的 redirect_uri?code=xxx&state=xxx 5. 你的后端用 code + client_id + client_secret + redirect_uri 请求 POST /api/oauth/token 6. 获得 access_token,后续请求携带 Authorization: Bearer <token> 调用 /api/auth/me 等接口
查看完整 API 文档(OpenAPI / Swagger)前往 OAuth 应用管理