Skip to content

OAuth 2.0:服务间调用与授权模式 ​

OAuth 2.0 是一套开放授权框架,用于让客户端在不直接获取资源所有者密码的情况下,获得访问受保护资源的有限权限。

1. OAuth 2.0 是什么 ​

OAuth 2.0 主要解决的是“授权”,不是完整的用户登录协议。常见实现会结合 JWT、OpenID Connect 或其他身份系统完成认证。

它解决的核心问题是:

text
客户端如何在不接触用户密码的情况下
获得访问受保护资源的有限权限

2. 四个核心角色 ​

角色含义
资源所有者 Resource Owner对受保护资源拥有授权决定权的主体,通常是用户
客户端 Client请求访问资源的应用,可以是前端、移动端或后端服务
授权服务器 Authorization Server负责验证客户端或用户身份,并签发 access token
资源服务器 Resource Server保存受保护资源,并验证 access token 后提供 API

授权服务器和资源服务器可以是两个独立服务,也可以由同一个系统承担。


3. Client Credentials 模式 ​

Client Credentials Grant 适合后端服务之间的调用:

text
没有用户参与
客户端使用自己的身份申请 token

基本流程:

text
客户端持有 client_id + client_secret
  ↓
POST /oauth/token
grant_type=client_credentials
  ↓
授权服务器验证客户端凭证
  ↓
返回 access_token 和 expires_in
  ↓
客户端请求业务 API
Authorization: Bearer <access_token>
  ↓
资源服务器验证 token 并返回资源

请求示例:

http
POST /oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials&client_id=...&client_secret=...

访问资源示例:

http
GET /api/protected-resource
Authorization: Bearer <access_token>

这个模式表达的是:

text
应用访问应用资源

不是:

text
某个用户登录后访问自己的资源

4. 为什么要缓存 access token ​

access token 通常有有效期。客户端不应该每次调用业务接口前都重新申请 token,而应该:

  • 保存 token 和过期时间;
  • 在有效期内复用 token;
  • 在提前一段时间,例如提前 5~10 分钟刷新;
  • 收到 token 失效响应时重新申请并重试一次。

这样可以减少授权服务器压力,也避免业务请求因频繁换 token 变慢。


5. scope 的作用 ​

scope 表示客户端请求或被授予的权限范围,例如:

text
read:users
write:orders

它解决的是:

text
客户端可以访问哪些资源
或者
客户端可以执行哪些操作

因此要区分:

text
认证:你是谁?
授权:你能做什么?

有效 token 只说明客户端通过了身份验证。

资源服务器仍然可以根据 scope、角色、资源归属和业务规则拒绝请求。


6. access token、JWT 与 OAuth 2.0 的关系 ​

三者不是同一个概念:

概念作用
OAuth 2.0授权框架,规定角色、流程和 token 使用方式
access token客户端访问资源时携带的凭证
JWT一种 token 的数据格式和签名方式

access token 可以是 JWT,也可以是不透明的随机字符串。

使用 JWT 时,资源服务器可以通过签名、过期时间和声明验证 token。

使用不透明 token 时,通常需要向授权服务器或数据库查询其状态。


7. 常见授权模式 ​

授权码模式 Authorization Code ​

适合用户参与的 Web 或移动应用授权:

text
用户登录并同意授权
  ↓
客户端获得 authorization code
  ↓
客户端用 code 换 access_token

常见参数包括:

text
response_type=code
client_id
redirect_uri
scope
state

现代 Web 应用通常还会使用 PKCE。

客户端凭证模式 Client Credentials ​

适合后端服务调用后端服务:

  • 不需要用户登录;
  • 不需要跳转;
  • 是服务间 API 调用的重点模式。

密码模式 Resource Owner Password Credentials ​

客户端直接提交用户名和密码换 token。

它会扩大客户端接触用户密码的范围,已经不适合新系统,通常只在遗留系统兼容场景中出现。

隐式模式 Implicit ​

早期为浏览器前端设计,直接返回 token。

由于 token 暴露和安全控制问题,现代新系统通常不再推荐使用。


8. OAuth 2.0 与 Casbin 的区别 ​

OAuth 2.0 主要负责授权流程和 token。

Casbin 是访问控制策略引擎,负责根据主体、资源、动作和策略判断是否允许访问。

text
OAuth 2.0:
客户端能否获得并使用 access token?

Casbin:
这个主体能否对这个资源执行这个动作?

二者可以组合使用,但互相不能替代:

text
先认证并解析 token
  ↓
得到主体身份
  ↓
Casbin 或其他权限系统执行授权判断

9. 学习时最容易混淆的点 ​

  • OAuth 2.0 不等于登录系统;
  • client 不一定是浏览器,也可能是后端服务;
  • authorization server 不一定和 resource server 分开部署;
  • client_credentials 不涉及用户同意页和 redirect_uri;
  • client_secret 只能放在可信后端,不能安全地放进公开前端;
  • HTTPS、secret 保管、token 过期、撤销、scope 限制和日志脱敏都属于实际安全要求;
  • 不要把数据库表名、角色命名和某个框架的实现方式误当成 OAuth 2.0 标准本身。

10. 一句话总结 ​

OAuth 2.0 是“如何让客户端获得访问受保护资源的授权”的通用框架。

其中 Client Credentials 模式专门适合后端服务之间使用应用身份换取 token,再携带 Bearer token 调用 API。

基于 VitePress 构建