面试知识库
进阶

OAuth2认证流程#

一句话答案#

OAuth2 是授权框架(非认证),核心思想是用户授权第三方应用获取资源,而非直接给出密码;四种授权模式中最常用的是授权码模式(Authorization Code),通过 code → access_token 两步交换避免 Token 暴露在前端。

核心要点

四种角色#

角色说明举例
Resource Owner资源所有者(用户)
Client第三方应用某网站
Authorization Server授权服务器微信开放平台
Resource Server资源服务器微信用户信息 API

授权码模式(最安全最常用)#

为什么需要 code 中转?

  • code 通过浏览器 URL 传递(可能被截获)
  • 但 code 换 Token 需要 client_secret(后端保存,不暴露)
  • 即使 code 被截获,没有 client_secret 也无法换取 Token

四种授权模式#

模式安全性适用场景
Authorization CodeWeb 后端应用(有服务端)
Authorization Code + PKCESPA / 移动端(无法安全存 secret)
Client Credentials服务间通信(无用户参与)
Implicit已废弃(Token 暴露在 URL)
Password已不推荐(用户直接给密码)

Spring Security OAuth2 集成#

# application.yml
spring:
  security:
    oauth2:
      client:
        registration:
          github:
            client-id: xxx
            client-secret: xxx
            scope: read:user
        provider:
          github:
            authorization-uri: https://github.com/login/oauth/authorize
            token-uri: https://github.com/login/oauth/access_token
            user-info-uri: https://api.github.com/user
yaml

Token 管理#

Access Token: 短有效期(1h),用于访问资源
Refresh Token: 长有效期(30d),用于刷新 Access Token
Scope: 限制 Token 能访问的资源范围

Token 撤销:
  POST /oauth/revoke {"token": "xxx"}
  → Authorization Server 将 Token 加入黑名单
plaintext
面试回答(2分钟版)

OAuth2 是授权框架,核心解决”第三方应用如何安全获取用户资源”的问题。最常用的授权码模式分两步:第一步用户在授权服务器(如微信)登录并授权,重定向回应用时带一个 code;第二步应用后端用 code + client_secret 去换取 access_token。这样设计的安全考虑是:code 虽然经过浏览器可能泄露,但没有 client_secret 无法换 Token,而 client_secret 只存在后端不暴露。拿到 access_token 后用它请求资源服务器获取用户信息。SPA 和移动端没有后端存 secret,就用 PKCE 扩展(动态生成 code_verifier 替代 secret)。实际项目中用 Spring Security OAuth2 Client 集成,配置好 registration 和 provider 就自动走完整流程。

追问与易错

追问方向:

  • “OAuth2 和 JWT 什么关系?”→ OAuth2 是授权框架,JWT 是 Token 格式;OAuth2 的 access_token 可以是 JWT 也可以是 opaque token
  • “为什么授权码模式要两步?”→ 防止 Token 暴露在前端 URL,code 只是一次性中转凭证
  • “Client Credentials 什么场景?”→ 服务间调用,无用户参与,用客户端自己的身份获取 Token
  • “PKCE 是什么?”→ SPA/移动端无法安全存 secret,用 code_verifier 的 hash 替代

易错点:

  • ❌ “OAuth2 是认证协议”——它是授权框架,解决的是”能访问什么资源”而非”你是谁”
  • ❌ “Implicit 模式安全”——已废弃,Token 暴露在 URL fragment 中
  • ❌ “有了 OAuth2 就不需要 JWT”——OAuth2 定义流程,JWT 是 Token 的一种实现格式