简介
OAuth 2.0 是用于授权的行业标准协议,用来授权第三方应用
,获取用户数据。该协议规范及其扩展正在 IETF OAuth工作组内开发。
OAuth 代表开放授权
,把应用的私有数据
安全得开放给指定的第三方应用。
术语
资源拥有者(Resource Owner)
:资源所有者是授权应用程序访问其帐户的用户
。应用程序对用户帐户的访问限于授权范围(Scope)(例如,读或写访问)。客户端(Client)
:客户端是尝试访问用户帐户的应用程序。在访问帐户之前,它需要获得用户的许可
。客户端可以向用户显示登录页面
或已登录账户的授权页
,以获取用于访问特定资源的访问令牌
(access token)。授权服务器(Authorization Server)
:授权服务器验证用户凭据(credentials)
,并使用授权码
(authorization code)将用户重定向回客户端。客户端与授权服务器进行通信以确认其身份
,并将代码交换为访问令牌。资源服务器(Resource Server)
:资源服务器是用于访问受保护的资源的服务器。它处理来自具有访问令牌的应用程序的经过身份验证的请求。范围(Scope)
:指定应用程序从客户端请求的访问级别。同意(Consent)
:"同意"
屏幕告诉您的用户谁正在请求访问其数据以及您要访问哪种数据。
在了解上面的术语之后,就可以进一步探讨 OAuth 的授权类型,各种授权的最终目的是获取访问令牌
(access token)来获取资源。
五种不同的授权流程
- 授权码授权(Authorization Code Grant)
- 隐式授权(Implicit Grant)
- 资源所有者证书授权(Resource Owner Credentials Grant)
- 客户端证书授权(Client Credentials Grant)
- 刷新令牌授权(Refresh Token Grant)
授权码授权
这种是较为完备的授权方式,在RFC-6749中,解释了它用于同时获取 访问令牌
(access token)和刷新令牌
(refresh token)。在访问令牌
失效后,通过刷新令牌
重新获取访问令牌
。
该模式整体流程:
- 客户端发起授权请求,用户允许授权客户端后,会拉起客户端应用或重定向到客户端网站,并且带上授权临时票据 code(授权码)参数;
- 通过 code 参数加上 client_id 和 client_secret 等,通过 API 换取 access_token;
- 通过 access_token 进行接口调用,获取用户基本数据资源或帮助用户实现基本操作;
他的授权流程如下:
这里的客户端(Client)并非指的浏览器,指代基于浏览器的 web 应用,通常把一个 server 端(后台)作为代理和授权服务器进行授权认证。 关键参数解释:
client_id
和client_secret
: 由授权服务器
生成,并且需要预先在授权服务器
做备案。一旦生成基本保持固定值,通过它来确认客户端资质;scope
:确定授权范围;state
:用于保持请求和回调的状态,授权请求后原样带回给客户端。该参数可用于防止csrf攻击
(跨站请求伪造攻击),建议用户端(例如:浏览器)带上该参数,可设置为简单的随机数加 session 进行校验;code
:授权码(authorization code),用于获取 access_token 的临时凭证。为了安全起见,会有比较短的失效期
和只能使用一次
的限制,时效时间通常设为几分钟。
client_id
定义为客户端标识(Client Identifier),授权服务器颁发给已注册客户端的唯一身份标识;它表示了客户端提供的身份信息并且无需加密;它暴露给资源拥有者,并且不允许单独被用于客户端授权。
隐式授权
故事
:在此流程中,客户端直接获得 token,而无需执行额外的授权代码交换步骤,就能访问资源服务器上的资源。
他的授权流程如下:
这种方式省去了通过 code 交换 access token 的流程。
客户端证书授权
故事
:客户端应用程序将其客户端凭据(客户端标识符和客户端密钥)提供给授权服务器,以请求批准访问资源服务器上的受保护资源(由客户端应用程序拥有)。授权服务器对客户端凭据进行身份验证并颁发 token。
它的流程如下:
此流程中,客户端可以仅使用其客户端凭据(或其他受支持的身份验证方法)获取 token。
资源所有者证书授予
该授权需要资源所有者
和客户端
具有信任关系下进行,启动此类型要格外小心,仅在其他流程不可行时才允许它。
客户端将要求用户提供其授权凭证(通常是用户名和密码),该流程如下:
刷新令牌授权
令牌如果过期,没必要重新走流程,OAuth 允许直接刷新令牌即可获得有效令牌。
它的具体流程如下:
遵循OAuth 2.0授权的应用
在这些授权类型中授权码授权
的方式最为常用,像腾讯开放平台的授权登录、钉钉的免登流程、Github的授权登录等等。
扩展阅读:
> docs.github.com/en/develope…
> www.loginradius.com/blog/async/…