protocolEndpoint
title: 3. 协议端点 (Protocol Endpoints) sidebar_position: 3
3. 协议端点
授权过程采用了两种授权服务器端点(HTTP资源):
- 授权端点——客户端用其通过用户代理重定向从资源所有者获取授权。
- 令牌端点——客户端用其将授权许可交换为访问令牌,通常伴有客户端身份验证。
以及一种客户端端点:
- 重定向端点——授权服务器用其通过资源所有者用户代理向客户端返回含有授权凭据的响应。
并不是每种授权许可类型都采用两种端点。
扩展许可类型可以按需定义其他端点。
3.1. 授权端点
授权端点用于与资源所有者交互获取授权许可。 授权服务器必须先验证资源所有者的身份。 授权服务器对资源所有者进行身份验证的方式(例如,用户名和密码登录、会话cookies)超出了本规范的范围。
客户端通过何种方式获得授权端点的位置超出了本文档范围,但该位置通常在服务文档中提供。
端点URI可以包含“application/x-www-form-urlencoded”格式(按[附录B]) )的查询部分([RFC3986的3.4节][RFC3986#3.4]),当添加额外的查询参数时必须保留该部分。端点URI不得包含片段部分。
由于向授权端点的请求引起用户身份验证和明文凭据传输(在HTTP响应中),当向授权端点发送请求时,授权服务器必须要求如1.6 节所述的TLS的使用。
授权服务器对于授权端点必须支持使用HTTP“GET”方法RFC2616,也可以支持使用“POST”的方法。
发送的没有值的参数必须被对待为好像它们在请求中省略了。授权服务器必须忽略不能识别的请求参数。 请求和响应参数不能包含超过一次。
[RFC3986#3.4]: "Uniform Resource Identifier (URI): Generic Syntax 3.4节"
3.1.1. 响应类型
授权端点被授权码许可类型和隐式许可类型流程使用。客户端使用下列参数通知授权服务器期望的许可类型:
- response_type
必需的。其值必须是如4.1.1节所述用于请求授权码的“code”, 如4.2.1节所述用于请求访问令牌的“token”(隐式许可) 或者如8.4节所述的一个注册的扩展值之中的一个。
扩展响应类型可以包含一个空格(%x20)分隔的值的列表,值的顺序并不重要(例如,响应类型“a b”与“b a”相同)。 这样的复合响应类型的含义由他们各自的规范定义。
如果授权请求缺少“response_type”参数,或者如果响应类型不被理解,授权服务器必须返回一个4.1.2.1。 所述的错误响应。
3.1.2.1. 端点请求的机密性
当所请求的响应类型是“code”或“token”时,或者当重定向请求将引起机密凭据通过公开网络传输时,重定向端点应该要求使用[1.6]节所述的TLS。 本规范没有强制使用TLS,因为在撰写本规范时,要求客户端部署TLS对于许多客户端开发者是一严重的困难。如果TLS不可用,授权服务器应该在重定向之前警告资源所有者有关非安全端点(例如,在授权请求期间现实一条信息)。
缺乏传输层安全可能对客户端及它被授权访问的受保护资源的安全具有严重影响。当授权过程用作一种客户端委托的对最终用户认证(例如,第三方登录服务)的形式时,使用传输层安全尤其关键。
3.1.2.2. 注册要求
授权服务器必须要求下列客户端注册它们的重定向端点:
- 公开客户端。
- 采用隐式许可类型的机密客户端。
授权服务器应该要求所有客户端在使用授权端点前注册它们的重定向端点。
授权服务器应该要求客户端提供完整的重定向URI(客户端可以使用“state”请求参数实现每请求自定义)。如果要求完整的重定向URI注册不可行,授权服务器应该要求注册URI方案、授权和路径(当请求授权时只允许客户端动态改变重定向URI的查询部分)。
授权服务器可以允许客户端注册多个重定向端点。
缺少重定向URI注册的要求,可能使攻击者如10.15所述将授权端点用作自由重定向端点。
3.1.2.3. 动态配置
如果多个重定向URI被注册,或者如果只有部分重定向URI被注册,或者如果没有重定向URI被注册,客户端都必须使用“redirect_uri”请求参数在授权请求中包含重定向URI。
当重定向URI被包含在授权请求中时,若有任何重定向URI被注册,授权服务器必须将接收到的值与至少一个已注册的重定向URI(或URI部分)按[RFC3986第6节][RFC3986#6] 所述进行比较并匹配。如果客户端注册包含了完整的重定向URI,授权服务器必须使用[RFC3986第6.2.1节][RFC3986#6.2.1] 中定义的简单字符串比较法比对这两个URI 。
[RFC3986#6]: "Uniform Resource Identifier (URI): Generic Syntax 6节"
[RFC3986#6.2.1]: "Uniform Resource Identifier (URI): Generic Syntax 6.2.1节"
3.1.2.4. 无效端点
如果由于缺失、无效或不匹配的重定向URI而验证失败,授权服务器应该通知资源所有者该错误且不能向无效的重定向URI自动重定向用户代理。
3.1.2.5. 端点内容
向客户端端点的重定向请求通常会引起由用户代理处理的HTML文档响应。如果HTML响应直接作为重定向请求的服务结果,任何包含在HTML文档中的脚本将执行,并具有对重定向URI和其包含的凭据的完全访问权限。
客户端不应该在重定向端点的响应中包含任何第三方的脚本(例如,第三方分析、社交插件、广告网络)。相反,它应该从URI中提取凭据并向另一个端点重定向用户代理而不暴露凭据(在URI中或其他地方)。如果包含第三方脚本,客户端必须确保它自己的脚本(用于从URI中提取凭据并从URI中删除)将首先执行。
3.1.2. 重定向端点
在完成与资源所有者的交互后,授权服务器引导资源所有者的用户代理返回到客户端。授权服务器重定向用户代理至客户端的重定向端点,该端点是事先在客户端注册过程中或者当发起授权请求时与授权服务器建立的。
重定向端点URI必须是如[RFC3986的3.4节][RFC3986#3.4] 所述的绝对URI。端点URI可以包含“application/x-www-form-urlencoded”格式(按附录B )的查询部分([RFC3986的3.4节][RFC3986#3.4]),当添加额外的查询参数时必须保留该部分。端点URI不得包含片段部分。
[RFC3986#3.4]: "Uniform Resource Identifier (URI): Generic Syntax 3.4节"
3.2. 令牌端点
客户端通过提交它的授权许可或刷新令牌使用令牌端点获取访问令牌。令牌端点被用于除了隐式许可类型(因为访问令牌是直接颁发的)外的每种授权许可中。
客户端通过何种方式获得令牌端点的位置超出了本文档范围,但该位置通常在服务文档中提供。
端点URI可以包含“application/x-www-form-urlencoded”格式(按[附录B]) )的查询部分([RFC3986的3.4节][RFC3986#3.4]),当添加额外的查询参数时必须保留该部分。端点URI不得包含片段部分。
由于向令牌端点的请求引起明文凭据的传输(在HTTP请求和响应中),当向令牌端点发送请求时,授权服务器必须要求如1.6。
节所述的TLS的使用。
当发起访问令牌请求时,客户端必须使用HTTP“POST”方法。
发送的没有值的参数必须被对待为好像它们在请求中省略了。授权服务器必须忽略不能识别的请求参数。请求和响应参数不能包含超过一次。
- 3.2.1. 客户端身份验证
[RFC3986#3.4]: "Uniform Resource Identifier (URI): Generic Syntax 3.4节"
3.2.1. 客户端身份验证
在向令牌端点发起请求时,机密客户端或其他被颁发客户端凭据的客户端必须如2.3 节所述与授权服务器进行身份验证。客户端身份验证用于:
- 实施刷新令牌和授权码到它们被颁发给的客户端的绑定。当授权码在不安全通道上向重定向端点传输时,或者 当重定向URI没有被完全注册时,客户端身份验证是关键的。
- 通过禁用客户端或者改变其凭据从被入侵的客户端恢复,从而防止攻击者滥用被盗的刷新令牌。改变单套客户端凭据显然快于撤销一整套刷新令牌。
- 实现身份验证管理的最佳实践,要求定期凭证轮转。轮转一整套刷新令牌可能是艰巨的,而轮转单组客户端凭据显然更容易。
在向令牌端点发送请求时,客户端可以使用“client_id”请求参数标识自己。向令牌端点的“authorization_code”和“grant_type”请求中,未经身份验证的客户端必须发送它的“client_id”,以防止自己无意中接受了本打算给具有另一个“client_id”的客户端的代码。这保护了客户端免于被替换认证码。(它没有对受保护资源提供额外的安全。)
3.3. 访问令牌范围
授权端点和令牌端点允许客户端使用“scope”请求参数指定访问请求的范围。反过来,授权服务器使用“scope”响应参数通知客户端颁发的访问令牌的范围。
范围参数的值表示为以空格分隔,大小写敏感的字符串。 由授权服务器定义该字符串。如果该值包含多个空格分隔的字符串,他们的顺序并不重要且每个字符串为请求的范围添加一个额外的访问区域。
scope scope-token *( SP scope-token )
scope-token 1*( %x21 / %x23-5B / %x5D-7E )
基于授权服务器的策略或资源拥有者的指示,授权服务器可以全部或部分地忽略客户端请求的范围。如果颁发的访问令牌范围和客户端请求的范围不同,授权服务器必须包含“scope”响应参数通知客户端实际许可的范围。
在请求授权时如果客户端忽略了范围参数,授权服务器必须要么使用预定义的默认值处理请求,要么使请求失败以指出无效范围。授权服务器应该记录它的范围需求和默认值(如果已定义)。