授权过程采用了两种授权服务器端点(HTTP资源):
- 授权端点——客户端用其通过用户代理重定向从资源所有者获取授权。
- 令牌端点——客户端用其将授权许可交换为访问令牌,通常伴有客户端身份验证。
以及一种客户端端点:
- 重定向端点——授权服务器用其通过资源所有者用户代理向客户端返回含有授权凭据的响应。
并不是每种授权许可类型都采用两种端点。扩展许可类型可以按需定义其他端点。
目录
一、授权端点
授权端点用于与资源所有者交互获取授权许可。 授权服务器必须先验证资源所有者的身份。 授权服务器对资源所有者进行身份验证的方式(例如,用户名和密码登录、会话cookies)超出了本规范的范围。客户端通过何种方式获得授权端点的位置超出了本文档范围,但该位置通常在服务文档中提供。
端点URI可以包含“application/x-www-form-urlencoded”格式(按附录B)的查询部分(RFC3986的3.4节),当添加额外的查询参数时必须保留该部分。端点URI不得包含片段部分。
由于向授权端点的请求引起用户身份验证和明文凭据传输(在HTTP响应中),当向授权端点发送请求时,授权服务器必须要求如1.6节所述的TLS的使用。
授权服务器对于授权端点必须支持使用HTTP“GET”方法RFC2616,也可以支持使用“POST”的方法。
发送的没有值的参数必须被对待为好像它们在请求中省略了。授权服务器必须忽略不能识别的请求参数。 请求和响应参数不能包含超过一次。
1、响应类型
授权端点被授权码许可类型和隐式许可类型流程使用。客户端使用下列参数通知授权服务器期望的许可类型:
- response_type
必需的。其值必须是如4.1.1节所述用于请求授权码的“code”,如4.2.1节所述用于请求访问令牌的“token”(隐式许可)或者如8.4节所述的一个注册的扩展值之中的一个。
扩展响应类型可以包含一个空格(%x20)分隔的值的列表,值的顺序并不重要(例如,响应类型“a b”与“b a”相同)。 这样的复合响应类型的含义由他们各自的规范定义。
如果授权请求缺少“response_type”参数,或者如果响应类型不被理解,授权服务器必须返回一个4.1.2.1所述的错误响应。
2、重定向端点
在完成与资源所有者的交互后,授权服务器引导资源所有者的用户代理返回到客户端。授权服务器重定向用户代理至客户端的重定向端点,该端点是事先在客户端注册过程中或者当发起授权请求时与授权服务器建立的。
重定向端点URI必须是如RFC3986的3.4节所述的绝对URI。端点URI可以包含“application/x-www-form-urlencoded”格式(按附录B)的查询部分(RFC3986的3.4节),当添加额外的查询参数时必须保留该部分。端点URI不得包含片段部分。
三、令牌端点
客户端通过提交它的授权许可或刷新令牌使用令牌端点获取访问令牌。令牌端点被用于除了隐式许可类型(因为访问令牌是直接颁发的)外的每种授权许可中。
客户端通过何种方式获得令牌端点的位置超出了本文档范围,但该位置通常在服务文档中提供。
端点URI可以包含“application/x-www-form-urlencoded”格式(按附录B)的查询部分(RFC3986的3.4节),当添加额外的查询参数时必须保留该部分。端点URI不得包含片段部分。
由于向令牌端点的请求引起明文凭据的传输(在HTTP请求和响应中),当向令牌端点发送请求时,授权服务器必须要求如1.6节所述的TLS的使用。
当发起访问令牌请求时,客户端必须使用HTTP“POST”方法。
发送的没有值的参数必须被对待为好像它们在请求中省略了。授权服务器必须忽略不能识别的请求参数。请求和响应参数不能包含超过一次。
客户端身份验证
在向令牌端点发起请求时,机密客户端或其他被颁发客户端凭据的客户端必须如2.3节所述与授权服务器进行身份验证。客户端身份验证用于:
- 实施刷新令牌和授权码到它们被颁发给的客户端的绑定。当授权码在不安全通道上向重定向端点传输时,或者 当重定向URI没有被完全注册时,客户端身份验证是关键的。
- 通过禁用客户端或者改变其凭据从被入侵的客户端恢复,从而防止攻击者滥用被盗的刷新令牌。改变单套客户端凭据显然快于撤销一整套刷新令牌。
- 实现身份验证管理的最佳实践,要求定期凭证轮转。轮转一整套刷新令牌可能是艰巨的,而轮转单组客户端凭据显然更容易。
在向令牌端点发送请求时,客户端可以使用“client_id”请求参数标识自己。向令牌端点的“authorization_code”和“grant_type”请求中,未经身份验证的客户端必须发送它的“client_id”,以防止自己无意中接受了本打算给具有另一个“client_id”的客户端的代码。这保护了客户端免于被替换认证码。(它没有对受保护资源提供额外的安全。)
三、访问令牌范围
授权端点和令牌端点允许客户端使用“scope”请求参数指定访问请求的范围。反过来,授权服务器使用“scope”响应参数通知客户端颁发的访问令牌的范围。
范围参数的值表示为以空格分隔,大小写敏感的字符串。 由授权服务器定义该字符串。如果该值包含多个空格分隔的字符串,他们的顺序并不重要且每个字符串为请求的范围添加一个额外的访问区域。
scope = scope-token *( SP scope-token )
scope-token = 1*( %x21 / %x23-5B / %x5D-7E )
基于授权服务器的策略或资源拥有者的指示,授权服务器可以全部或部分地忽略客户端请求的范围。如果颁发的访问令牌范围和客户端请求的范围不同,授权服务器必须包含“scope”响应参数通知客户端实际许可的范围。
在请求授权时如果客户端忽略了范围参数,授权服务器必须要么使用预定义的默认值处理请求,要么使请求失败以指出无效范围。授权服务器应该记录它的范围需求和默认值(如果已定义)。