2026-04-19 07:35:09
在传统客户端-服务器身份验证模型中,客户端使用资源所有者凭据(如用户名密码)访问受限资源,存在以下问题:
OAuth 2.0 通过引入授权层,分离客户端与资源所有者角色,使用访问令牌替代凭据,解决上述问题。
资源所有者(Resource Owner)
授予对受保护资源访问权限的实体(通常为最终用户)。
资源服务器(Resource Server)
托管受保护资源,验证访问令牌并响应请求。
客户端(Client)
代表资源所有者发起请求的应用程序(如移动App、Web服务)。
授权服务器(Authorization Server)
验证资源所有者身份后颁发访问令牌,可与资源服务器分离或合并。
OAuth 2.0 核心流程包含以下步骤:
客户端请求授权
直接或通过授权服务器间接向资源所有者请求授权。
获取授权许可(Authorization Grant)
资源所有者通过四种授权类型之一(或扩展类型)授予许可。
请求访问令牌
客户端携带授权许可向授权服务器验证身份并申请令牌。
颁发访问令牌
授权服务器验证后发放令牌(可能包含刷新令牌)。
访问受保护资源
客户端携带令牌向资源服务器发起请求。
验证令牌并响应
资源服务器验证令牌有效性后提供服务。
规范定义四种标准授权类型,适用于不同场景:
1. 授权码(Authorization Code)客户端引导用户至授权服务器,后者返回授权码至客户端。
客户端用授权码换取访问令牌。
资源所有者凭据不共享给客户端。
支持客户端身份验证,提升安全性。
授权服务器直接返回访问令牌(无中间授权码)。
简化流程,减少往返次数。
令牌可能通过URI片段暴露,存在安全隐患。
客户端直接使用用户名密码换取令牌。
仅限高度信任场景(如设备操作系统)。
需避免长期存储凭据。
客户端用自身凭据(如API密钥)换取令牌。
适用于客户端代表自身访问资源。
限定访问范围(Scope)和有效期。
格式由资源服务器决定(如JWT、不透明令牌)。
传输和存储需保密,仅通过TLS传输。
隐式流程中需防范URI暴露风险。
客户端携带刷新令牌向授权服务器申请新令牌。
授权服务器验证后颁发新令牌(可选更新刷新令牌)。
绑定客户端身份,防止滥用。
支持轮换机制(如每次刷新颁发新令牌)。
机密客户端(如Web服务)必须验证身份。
公开客户端(如浏览器应用)需通过重定向URI等替代方案验证。
最小权限原则:客户端应请求最小必要范围。
防止猜测攻击:授权服务器需确保令牌不可预测。
绑定客户端身份,支持轮换以检测泄露。
传输和存储需保密,仅通过TLS传输。
强制资源所有者明确授权(如交互式确认)。
提供授权详情(客户端信息、范围、有效期)。
防止自动处理重复请求(避免模拟攻击)。
OAuth 2.0 通过角色分离、令牌机制和多样化授权类型,为现代应用提供了安全、灵活的授权框架,适用于Web、移动和设备等多种场景。