Skip to content

OAuth2 和 JWT 的关系

首先需要澄清一个常见的认知错误:access_token 和 refresh_token 是 OAuth2 规范的内容,而不是 JWT 规范的一部分。JWT 只定义了 token 的编码、加密和解密方式,并不规定 token 的使用方式。OAuth2 作为一种认证规范,定义了 refresh_token 和 access_token 两种 token,这两个 token 可以使用 JWT 来构建,也可以使用其他方式。

OAuth2 的双 Token 机制

OAuth2 定义了资源服务器和授权服务器两个角色:

  1. 用户首次认证时向授权服务器提交用户名和密码,获取两个 token
  2. 访问资源服务器时使用 access_token
  3. 资源服务器通常不被完全信任,因此不能获知 refresh_token
  4. access_token 失效后,客户端使用 refresh_token 向授权服务器获取新的 access_token

实际应用流程

  1. 用户登录:

    • 用户提供用户名和密码
    • 系统返回 access_token 和 refresh_token
  2. 日常接口访问:

    • 请求需携带 access_token
    • 无需使用 refresh_token
  3. Token 更新:

    • access_token 即将过期时
    • 使用 refresh_token 获取新的 access_token

安全性考虑

  1. JWT 的特性:

    • 去中心化设计
    • 已发放的 token 无法撤销
    • 每次请求都需携带 token
  2. 安全风险与解决方案:

    • access_token 设置较短有效期,降低被盗用风险
    • refresh_token 使用频率低,降低暴露风险
    • 双 token 机制提供了安全性与便利性的平衡

实际应用案例

许多平台(如抖音、钉钉等)都采用类似机制:

  • 应用注册获取 appkey 和 appsecret
  • 使用这些凭证获取 access_token 和 refresh_token
  • access_token 通常 1-2 小时有效
  • refresh_token 有效期较长
  • API 调用使用 access_token
  • 通过 refresh_token 定期更新 access_token