文章目录
- 先说结论
- 核心角色
- 四种授权模式
- 授权码模式(最安全,最常用)
- 隐式模式(已不推荐)
- 密码模式
- 客户端凭证模式
- Token:Access Token + Refresh Token
- OAuth vs JWT
- 回答技巧与点评
- 加分回答
- 面试官点评
个人网站
“用微信登录”——这个按钮背后就是 OAuth。很多人用过 OAuth 但讲不清它是什么,和 JWT 是什么关系。面试官问这题,他想听的是:你能不能讲清 OAuth 2.0 的四种授权模式、Token 的工作流程、以及和 JWT 的区别?
先说结论
| 维度 | 说明 |
|---|---|
| 是啥 | 开放授权协议,让用户授权第三方应用访问自己的资源 |
| 核心 | 让用户不用把密码告诉第三方,也能授权其访问 |
| 版本 | OAuth 2.0(主流) |
| 四种模式 | 授权码、隐式、密码、客户端凭证 |
| 最常用 | 授权码模式(微信/QQ/Google 登录都用它) |
| 和 JWT 关系 | OAuth 是协议,JWT 是 Token 格式 |
|一句话记住:OAuth就像"酒店房卡"——你授权前台给朋友发一张临时房卡,朋友能进房间但不知道你的身份证号"
核心角色
┌──────────┐ 1.授权请求 ┌──────────┐ │ │ ──────────────→ │ │ │ 客户端 │ │ 资源 │ │ (第三方App)│ ←────────────── │ 所有者 │ 👈 用户 │ │ 2.用户同意 │ (你) │ └────┬─────┘ └──────────┘ │ │ 3.授权码 ↓ ┌──────────┐ 4.授权码+密钥 ┌──────────┐ │ │ ──────────────→ │ │ │ 客户端 │ │ 授权 │ │ │ ←────────────── │ 服务器 │ 👈 微信/QQ │ │ 5.访问令牌 │ │ └────┬─────┘ └──────────┘ │ │ 6.访问令牌 ↓ ┌──────────┐ 7.受保护的资源 ┌──────────┐ │ │ ──────────────→ │ │ │ 客户端 │ │ 资源 │ │ │ ←────────────── │ 服务器 │ └──────────┘ 8.资源数据 └──────────┘- 资源所有者:你(用户)
- 客户端:第三方应用(如"用微信登录"的那个网站)
- 授权服务器:微信的认证服务器
- 资源服务器:微信的用户信息服务器
四种授权模式
授权码模式(最安全,最常用)
1. 用户点"用微信登录" → 跳转微信授权页 2. 用户在微信页点"同意" → 微信返回授权码(code) 3. 第三方网站用 code + 密钥 → 向微信换 Token 👈 4. 微信返回 Access Token 5. 第三方网站用 Token → 获取用户信息为什么最安全?用户密码只在微信页面输入,第三方网站只拿到授权码,授权码还要配合密钥才能换 Token。而且密钥存在服务端,不会暴露给浏览器。
隐式模式(已不推荐)
1. 用户点"用微信登录" → 跳转微信授权页 2. 用户同意 → 微信直接返回 Token(在URL fragment中) 3. 浏览器提取 Token → 直接用 👈Token 直接暴露在浏览器中,容易被截获。OAuth 2.1 已废弃此模式。
密码模式
1. 用户直接把微信账号密码给第三方网站 👈 2. 网站用密码向微信换 Token只适合自家应用(第一方),第三方绝对不能用。
客户端凭证模式
1. 第三方用 client_id + client_secret 直接换 Token 2. 不需要用户参与 👈适合服务间调用(机器对机器),不涉及用户授权。
| 模式 | 用户参与 | 安全性 | 场景 |
|---|---|---|---|
| 授权码 | 是 | 高 | 第三方登录 |
| 隐式 | 是 | 低(已废弃) | 旧SPA |
| 密码 | 是 | 中 | 第一方应用 |
| 客户端凭证 | 否 | 高 | 服务间调用 |
Token:Access Token + Refresh Token
Access Token: ├── 用来访问资源 ├── 有效期短(通常2小时) └── 泄露风险可控 Refresh Token: ├── 用来换新的 Access Token ├── 有效期长(通常30天) └── 只在服务端使用,不暴露给浏览器 👈// 用 Refresh Token 换新的 Access TokenPOST/oauth/token grant_type=refresh_token&refresh_token=xxx// 返回新的 Access Token + 新的 Refresh Token为什么两个 Token?就像银行卡——Access Token 是"储蓄卡"(日常用,丢了损失小),Refresh Token 是"U 盾"(不常用,安全级别高,用来办新卡)。
OAuth vs JWT
| 对比 | OAuth 2.0 | JWT |
|---|---|---|
| 本质 | 授权协议 | Token 格式 |
| 解决什么 | 怎么授权 | 怎么传令牌 |
| 关系 | OAuth 可以用 JWT 作为 Token 格式 |
OAuth 定义的是"授权流程"(怎么获取 Token),JWT 定义的是"Token 的数据格式"(自包含的用户信息)。两者不冲突——OAuth 的 Access Token 可以是 JWT 格式。
OAuth 全景 四种模式 ├── 授权码 —— 最安全,第三方登录用 ├── 隐式 —— 已废弃 ├── 密码 —— 第一方应用 └── 客户端凭证 —— 服务间调用 Token ├── Access Token —— 访问资源,短期 └── Refresh Token —— 刷新令牌,长期 与JWT关系 ├── OAuth —— 协议(怎么授权) ├── JWT —— 格式(令牌长什么样) └── OAuth可以用JWT作为Token格式 口诀:OAuth开放授权协议,四种模式分场景; 授权码最安全,第三方登录用它; 双Token长短搭配,Access用Refresh换; OAuth是协议JWT是格式,两者搭配最常见回答技巧与点评
标准回答:OAuth 2.0 是开放授权协议,让用户授权第三方应用访问自己的资源,无需暴露密码。四种授权模式:授权码模式(最安全,第三方登录用)、隐式模式(已废弃)、密码模式(第一方应用)、客户端凭证模式(服务间调用)。Token 分 Access Token(短期,访问资源)和 Refresh Token(长期,刷新令牌)。OAuth 是协议,JWT 是 Token 格式,两者不冲突。
加分回答
- 授权码 + PKCE:移动端 App 无法安全保存 client_secret,OAuth 2.0 引入 PKCE(Proof Key for Code Exchange),用动态生成的 code_verifier 替代密钥,防止授权码被截获
- Spring Security OAuth:Spring 生态的 OAuth 实现,但官方已停止维护,推荐用 Spring Authorization Server 替代。配置方式从 XML → 注解 → 函数式不断演进
- OAuth 2.1 的变化:隐式模式和密码模式被移除,只保留授权码模式(+PKCE)和客户端凭证模式。安全优先,简化了协议
面试官点评
这道题考的是你对授权认证协议的理解。最忌讳的回答是混淆 OAuth 和 JWT——面试官想听的是OAuth 的核心流程(四种模式)和Token 机制(双 Token)。能画出授权码模式的流程图,再说出 OAuth 和 JWT 的关系,就是高分回答。
原文阅读
内容有帮助?点赞、收藏、关注三连!评论区等你 💪