🔑 OAuth 2.0 假设:资源所有者天然拥有对自己资源的完全控制权。
假设你在 GitHub 上有一个私有仓库 my-project。
问题 | 谁决定? | 是否属于 OAuth 2.0? |
|---|---|---|
“你能不能访问 my-project?” | GitHub 的权限系统(你是仓库所有者) | ❌ 不属于 |
“第三方 App 能不能通过你的授权访问 my-project?” | 你点击‘同意’授权 + GitHub 的 OAuth 服务 | ✅ 属于 OAuth 2.0 |
→ OAuth 2.0 只处理第二层:一旦你是仓库所有者(第一层已成立),它帮你安全地把“访问权”临时委托给第三方。

RFC 6749 隐含了一个关键假设:
“资源所有者对其请求访问的资源拥有完全的控制权。”
这意味着:
💡 举例: 微信不会让你授权一个 App 访问“你朋友的聊天记录”,因为你根本没有这个权限。 所以授权页面只显示你能授权的 scope(如你的头像、昵称)。
虽然 OAuth 2.0 不管理权限来源,但它可以通过 Access Token 携带权限信息,供资源服务器使用。
scope=read_profileread_profile 权限scope: "read_profile"{
"sub": "user123",
"scope": ["read", "write"],
"roles": ["user", "premium"],
"permissions": ["order:read", "payment:create"]
}→ 资源服务器解析 JWT,直接获取细粒度权限。
⚠️ 但注意:谁往 Token 里写这些权限? 是授权服务器根据其内部权限系统(如数据库查用户角色)决定的——这仍是授权服务器的实现细节,非 OAuth 2.0 规范内容。
功能 | OAuth 2.0 | 权限管理系统(如 RBAC) |
|---|---|---|
定义用户角色 | ❌ 不支持 | ✅ 支持(如 admin, user) |
分配权限给角色 | ❌ 不支持 | ✅ 支持 |
判断用户能否访问资源 | ❌ 不直接判断 | ✅ 核心功能 |
委托临时访问权给第三方 | ✅ 核心功能 | ❌ 不涉及 |
管理 Token 生命周期 | ✅ 是 | ❌ 否 |
scope 替代 RBAC(scope 不是权限模型!)🛡️ 最佳实践: 授权服务器在生成 Token 前,应调用内部权限服务,只将用户实际拥有的权限放入 Token。
问题 | 答案 |
|---|---|
资源所有者的权限从哪里来? | 来自系统本身的权限模型(如你是文件所有者、你有 admin 角色等) |
OAuth 2.0 管理这个权限吗? | ❌ 完全不管。它假设权限已存在,只处理“委托” |
那 OAuth 2.0 作用是什么? | 安全地将已存在的权限,临时授予第三方客户端 |
谁负责权限管理? | 授权服务器背后的 IAM 系统(如用户中心、RBAC 引擎) |
🧠 终极理解: OAuth 2.0 不是“权限系统”,而是“权限快递员”。 它不生产权限,只是把权限从用户手里安全地送到第三方手上。
OAuth 2.0 的力量恰恰在于它的“专注”:只做委托,不做权限管理。这也正是它能与各种权限模型无缝集成的原因。