1.3. 授权许可
授权许可代表了资源所有者(允许访问他的受保护资源)的授权;客户端会使用其来获取访问令牌。本规范定义了三种许可类型,即授权码、刷新令牌和客户端凭据,以及一种扩展机制,用于定义额外的类型。
1.3.1. 授权码
授权码是一种临时凭据,用于获取访问令牌。客户端不是直接从资源所有者处请求授权,而是将资源所有者(通过其用户代理)定向到授权服务器;后者再将其定向回到客户端,并附上授权码。然后,客户端就可以用授权码去交换访问令牌。
在将资源所有者定向回到客户端并附上授权码之前,授权服务器会认证资源所有者,并且可能会征求资源所有者的同意,或者直接告知他们客户端的请求。由于资源所有者只与授权服务器进行认证,资源所有者的凭据永远不会被分享给客户端。客户端也无需知晓任何认证步骤,例如多因素认证或者委托账户。
授权码提供了一些重要的安全优势,例如认证客户端的能力,以及能够直接将访问令牌传输给客户端,而无需经过资源所有者的用户代理,从而避免潜在的泄露危险,其中也包括泄露给资源所有者。
1.3.2. 刷新令牌
刷新令牌是用于获取访问令牌的凭据。授权服务器可以给客户端颁发刷新令牌;在当前访问令牌失效或过期时,刷新令牌可以用于获取新的访问令牌,或者获取另外的、范围一致或更小的访问令牌(与资源所有者所授权的相比,访问令牌可以有更短的寿命、更少的权限)。刷新令牌的颁发是可选的,具体由授权服务器来决定,并且可以根据客户端的属性、请求的属性、授权服务器的内部策略或任何其它依据来颁发。如果授权服务器选择颁发刷新令牌,那么刷新令牌会与访问令牌一并颁发(例如图 2 的步骤(2)所示)。
刷新令牌是一个字符串,代表了资源所有者授予客户端的授权。这一字符串对客户端不透明。刷新令牌可能是用于获取授权信息的标识符,也可能其本身就编码了这一信息。与访问令牌不同的是,刷新令牌只能被用于授权服务器,永远不会发送给资源服务器。
+--------+ +---------------+
| |--(1)------- Authorization Grant --------->| |
| | | |
| |<-(2)----------- Access Token -------------| |
| | & Refresh Token | |
| | | |
| | +----------+ | |
| |--(3)---- Access Token ---->| | | |
| | | | | |
| |<-(4)- Protected Resource --| Resource | | Authorization |
| Client | | Server | | Server |
| |--(5)---- Access Token ---->| | | |
| | | | | |
| |<-(6)- Invalid Token Error -| | | |
| | +----------+ | |
| | | |
| |--(7)----------- Refresh Token ----------->| |
| | | |
| |<-(8)----------- Access Token -------------| |
+--------+ & Optional Refresh Token +---------------+图 2:刷新过期的访问令牌
图 2 所示的流程包括以下步骤:
- 客户端与授权服务器进行认证,并展示授权许可,以请求访问令牌。
- 授权服务器认证客户端,并验证其授权许可。如果授权许可有效,就颁发访问令牌和可选的刷新令牌。
- 客户端展示访问令牌,与资源服务器进行认证,来请求资源服务器上的受保护资源。
- 资源服务器验证访问令牌。如果访问令牌有效,就为其提供服务。
- 重复步骤(3)和(4),直到访问令牌过期。如果客户端知道访问令牌已经过期,就直接跳转到步骤(7),否则就再次请求受保护资源。
- 由于访问令牌无效,资源服务器返回无效令牌错误。
- 客户端向授权服务器展示刷新令牌,并提供客户端的认证信息(如果它被颁发过凭据),以请求新的访问令牌。客户端的认证要求取决于客户端类型和授权服务器的策略。
- 授权服务器认证客户端,并验证其刷新令牌。如果刷新令牌有效,就颁发新的访问令牌(和可选的、新的刷新令牌)。
1.3.3. 客户端凭据
当授权范围限于由客户端控制的受保护资源时,或者限于与授权服务器预先协定好的受保护资源时,客户端凭据,或者其它形式的客户端认证信息(例如,用于给 JWT 签名的私钥,如 [RFC7523] 所述),可以被用作一种授权许可。客户端在根据与授权服务器预先协定好的授权,去请求访问受保护资源的时候,使用的就是客户端凭据。