OAuth2 调试工具
调试 OAuth2 授权流程,支持客户端凭证、授权码、密码三种模式的 Token 获取
端点配置
客户端凭证
将发送的请求
关于 OAuth2 调试工具
- OAuth 2.0 是目前最广泛使用的授权框架(RFC 6749),用于第三方应用安全访问用户资源
- 客户端凭证模式(Client Credentials):服务间调用,无需用户参与,适合后端微服务
- 授权码模式(Authorization Code):最安全的用户授权方式,适合 Web / 移动应用
- 密码模式(Resource Owner Password):直接用用户名密码换 Token,仅适用于高度信任的第一方应用
操作说明
- 选择授权模式后,点击「示例」按钮可加载对应模式的示例配置
- 授权码模式:先点击「打开授权页面获取 Code」,在弹出窗口完成授权后,将回调 URL 中的
code参数填入授权码字段 - 填写完成后点击「获取 Token」,响应结果格式化展示在右侧
- 如果返回的 access_token 是 JWT 格式,可复制后到 JWT 解析器工具查看详情
- 支持 Ctrl+Enter 快捷键触发请求
注意事项
- 请求由浏览器直接发出,目标 OAuth2 服务需支持 CORS,否则会被浏览器拦截(建议使用 Postman 等工具调试不支持 CORS 的服务)
- 请勿使用生产环境的真实 Client Secret 进行调试
- 密码模式已被 OAuth 2.1 草案废弃,新项目不建议使用
- 所有配置信息仅在浏览器本地处理,不会上传任何数据
OAuth 2.0 知识详解
四种授权模式对比(RFC 6749)
| 模式 | 适用场景 | 是否需要用户参与 | 安全性 | 推荐程度 |
|---|---|---|---|---|
| 授权码(Authorization Code) | Web 应用、移动 App、SPA(配合 PKCE) | 是 | 最高(code 换 token,secret 不暴露前端) | 强烈推荐 |
| 客户端凭证(Client Credentials) | 服务间调用、后台任务、微服务 | 否 | 高(仅限机器间通信) | 推荐 |
| 密码模式(Resource Owner Password) | 第一方高度信任应用(如官方 App) | 是(直接传用户名密码) | 低(密码暴露给客户端) | 不推荐(OAuth 2.1 已废弃) |
| 隐式模式(Implicit) | 旧版 SPA(已废弃) | 是 | 低(token 直接暴露在 URL 中) | 已废弃,禁止使用 |
授权码模式(Authorization Code)完整流程
-
用户点击「使用第三方登录」
客户端将用户重定向到授权服务器:
GET /authorize?response_type=code&client_id=xxx&redirect_uri=xxx&scope=openid&state=random -
用户在授权服务器登录并同意授权
授权服务器将用户重定向回客户端,携带授权码:
GET /callback?code=AUTH_CODE&state=random -
客户端后端用授权码换取 Token(服务端完成,不经过浏览器)
POST /token
grant_type=authorization_code&code=AUTH_CODE&client_id=xxx&client_secret=xxx&redirect_uri=xxx -
授权服务器返回 Token
{"access_token":"...","token_type":"Bearer","expires_in":3600,"refresh_token":"..."} -
客户端用 Access Token 访问资源服务器
GET /api/userinfo
Authorization: Bearer ACCESS_TOKEN
关键安全要点
- state 参数:防止 CSRF 攻击,每次请求随机生成,回调时验证
- PKCE(Proof Key for Code Exchange):公开客户端(SPA/移动 App)必须使用,防止授权码拦截攻击
- redirect_uri 严格匹配:授权服务器必须精确匹配预注册的回调地址
- 授权码一次性:code 使用后立即失效,有效期通常 10 分钟
PKCE(Proof Key for Code Exchange)— RFC 7636
PKCE 是授权码模式的安全增强,专为无法安全存储 Client Secret 的公开客户端(SPA、移动 App)设计。
流程
- 客户端生成随机字符串
code_verifier(43-128 字符) - 计算
code_challenge = BASE64URL(SHA256(code_verifier)) - 授权请求携带
code_challenge和code_challenge_method=S256 - 换 Token 时携带原始
code_verifier,服务器验证哈希是否匹配
# 生成 code_verifier(Node.js)
const verifier = crypto
.randomBytes(32)
.toString('base64url');
# 计算 code_challenge
const challenge = crypto
.createHash('sha256')
.update(verifier)
.digest('base64url');
Token 类型与 JWT 结构
Token 类型对比
| 类型 | 特点 | 验证方式 |
|---|---|---|
| Opaque Token | 随机字符串,无语义 | 每次请求需调用 introspection 端点验证 |
| JWT | 自包含,含 claims | 本地验证签名,无需网络请求 |
JWT 三段结构
Header 算法和类型
{"alg":"RS256","typ":"JWT"}
Payload 声明(Claims)
{"sub":"user123","iss":"https://auth.example.com","exp":1700000000,"scope":"openid profile"}
Signature 签名(防篡改)
RSASHA256(base64(header)+"."+base64(payload), privateKey)
常见 JWT Claims
| Claim | 全称 | 说明 |
|---|---|---|
iss | Issuer | 签发方(授权服务器地址) |
sub | Subject | 用户唯一标识 |
aud | Audience | 受众(资源服务器标识) |
exp | Expiration | 过期时间(Unix 时间戳) |
iat | Issued At | 签发时间 |
jti | JWT ID | 唯一标识,防重放攻击 |
scope | Scope | 授权范围 |
Refresh Token 机制
- Access Token 有效期通常较短(1 小时),Refresh Token 有效期较长(数天到数月)
- Access Token 过期后,客户端用 Refresh Token 静默换取新的 Access Token,无需用户重新登录
- Refresh Token 应安全存储(服务端 Session 或 HttpOnly Cookie),不应存储在 localStorage
- Refresh Token 轮换(Rotation):每次使用后颁发新的 Refresh Token,旧的立即失效,防止泄露
# 用 Refresh Token 换新 Token
POST /oauth2/token
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token
&refresh_token=REFRESH_TOKEN
&client_id=CLIENT_ID
&client_secret=CLIENT_SECRET
OpenID Connect(OIDC)— OAuth2 的身份层扩展
OAuth 2.0 只解决授权问题(你能做什么),OIDC 在其基础上增加了身份认证(你是谁)。
OIDC 新增内容- ID Token:JWT 格式,包含用户身份信息(sub、name、email 等)
- UserInfo 端点:
GET /userinfo,用 Access Token 获取用户详细信息 - Discovery 端点:
GET /.well-known/openid-configuration,自动发现授权服务器配置 - nonce 参数:防止 ID Token 重放攻击
常用 OIDC Scope
| Scope | 返回的用户信息 |
|---|---|
openid | sub(用户唯一 ID),必须包含 |
profile | name、nickname、picture、locale 等 |
email | email、email_verified |
phone | phone_number、phone_number_verified |
address | address(结构化地址) |
offline_access | 返回 Refresh Token |
主流 OAuth2 / OIDC 服务商端点参考
| 服务商 | 授权端点 | Token 端点 | Discovery |
|---|---|---|---|
| Microsoft Entra ID | https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize |
https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token |
/.well-known/openid-configuration |
https://accounts.google.com/o/oauth2/v2/auth |
https://oauth2.googleapis.com/token |
https://accounts.google.com/.well-known/openid-configuration |
|
| GitHub | https://github.com/login/oauth/authorize |
https://github.com/login/oauth/access_token |
不支持 OIDC |
| Keycloak | https://{host}/realms/{realm}/protocol/openid-connect/auth |
https://{host}/realms/{realm}/protocol/openid-connect/token |
/.well-known/openid-configuration |
| Auth0 | https://{domain}/authorize |
https://{domain}/oauth/token |
https://{domain}/.well-known/openid-configuration |