3 Protocol Endpoints(协议端点)
在授权过程中使用到了两个端点:
- 授权端点:客户端通过资源拥有者的重定向获得授权信息。
- Token端点:客户端向权限服务器获取access token。
还存在一个client的端点:
- 重定向端点:权限服务器向客户端返回授权的凭证。
3.1 Authorization Endpoint(授权端点)
授权端点是权限服务器和资源拥有者交互以便获得授权信息的端点。权限服务器必须验证资源拥有者的身份,通过何种方式(用户名、密码,会话cookie)验证超出该协议范围。
Client通过何种方式获取权限服务器授权端点的路径超出了讨论范围,不过一般都会在权限服务器的文档中说明。
端点的URI可能包含一个”application/x-www-form-urlencoded”格式的查询组件,当添加额外参数时必须保留这个组件。端点URI中不能包括不完整的查询组件。
由于发往授权端点的请求将导致明文传输的授权凭证,权限服务器必须要求客户端建立TLS的请求。
权限服务器必须支持Http Get方法,同样可以支持POST方法。
不包含值得参数必须忽略对待,服务器必须忽略不认识的参数。请求和响应中的参数不得出现超过一次。
3.1.1 Response Type (响应类型)
授权端点是为授权码类型和简化类型的授权服务的,客户端使用以下参数知会服务器其期望的授权类型:
response_type:必须。必须是章节4.1.1中描述的”code”、章节4.2.1描述的获取access token的“token”或者章节8.4描述的已注册的扩展值之一。
扩展响应类型可能保护一个空格(%x20)分隔的的类别,其中值是顺序无关的,这部分响应类型的意义定义在其对应的协议中。
如果一个请求没有或者提供了不可识别的响应类型,权限服务器必须返回4.1.2.1中描述的错误。
3.1.2 Redirection Point(重定向端点)
权限服务器完成与资源拥有者的交互后,需要将资源拥有者的访问器重定向到客户端。服务器将重定向到在客户端注册过程中或者是申请权限时指定的位置。
重定向URI必须是[RFC3986] Section 4.3中定义的绝对路径的URI。该URI中可能包含”application/x-www-form-urlencoded”格式的查询部分,当添加额外的参数时必须保留该查询部分。URI中不能包含不完整的部分。
3.1.2.1 Endpoint Request Confidentiality(端点请求的机密性)
当响应类型是“code”或者“token”,或是重定向结果将导致敏感凭证在公网上传输时,重定向端点要求是TLS。该协议没有正式要求使用TLS,因为在该协议写作时期,使用TLS对客户端开发者来说可能是一个重大障碍。如果彼时TLS不可用,权限服务器需要在重定向之前警告资源拥有者正在导向不安全的URI。
TLS的缺乏将对客户端和保护的资源造成严重影响。当客户端使用代理最终用户的授权模式(如第三方登录)时,TLS的使用显得尤为重要。
3.1.2.2 Registration Requirement(注册要求)
权限服务器要求以下两种客户端必须注册它们的重定向端点:
- 公共客户端。
- 采用简化模式的机密客户端。
权限服务器要求所有客户端在调用授权端点以前必须注册它们的重定向端点。
权限服务器要求客户端提供完整的重定向URI(客户端可以使用“state”参数实现每个URL的自定义)。如果无法提供完整的重定向URI,客户端至少要提供URI模式、权限和路径(只允许查询部分是可以变化的)。
权限服务器允许客户端注册多个重定向端点。
如果客户端注册缺少了重定向,攻击者可以把授权端点当做open redirector使用10.15。
3.1.2.3 Dynamic Configuration(动态配置)
如果注册多个重定向URI、或者注册了部分URI、或者未注册URI,客户端在发送授权请求是要包含“redirect_uri”的参数。
如果注册了任何URI,权限服务器接收到”redirect_uri”参数时需确定其值至少匹配某一条已注册的URI。如果注册时使用了全URI,权限服务器须使用简单的文本比对方法确定两者一致。
3.1.2.4 Invalid Endpoint(非法端点)
如果授权请求缺少、非法、不匹配注册的URI,权限服务器需要通知资源拥有者并中断自动重定向。
3.1.1.5 Endpoint Content(端点内容)
指向Client的重定向请求一般会返回HTML的响应,该响应会由浏览器处理。如果该HTML直接作为请求的响应返回,其中的脚本将对重定向URI和包含的凭证有完全访问权。
客户端应该确保响应不包含第三方的脚本(统计脚本、社交插件等)。取而代之,它应该抽取重定向URI中包含的凭证,并返回浏览器另一个URI以免暴露凭证。如果要包含第三方脚本,客户端需要确保自己的脚本优先运行。
3.2 Token Point(Token端点)
Token端点用于客户端使用授权码或刷新Token获取access token。Token服务于除使用简化流程(因为直接发布了access token)以外的所有授权方式。
客户端如何获得Token端点的地址不在讨论范围,但一般可以在文档中获得。
如果端点URI包含”application/x-www-form-urlencoded”格式的查询部分则必须保存,不得包含不完整的查询。
由于涉及明文传输凭证,在发起请求时必须使用TLS。
客户端必须使用POST方法发起access token的请求。
客户端发起请求时不包含值得参数必须忽略。权限服务器需要忽略未知的参数。统一参数在请求中只能出现一次。
3.2.1 Client Authentication(客户端鉴权)
机密客户端或者其它发布凭证的客户端在发起Token端点请求前,必须要向权限服务器鉴权。客户端鉴权用于:
- 强制绑定发布给其的授权码和刷新Token。当使用不安全通道传递授权码或者没有注册完全重定向URI时,客户端鉴权显得尤为重要。
- 恢复被禁用或者变更用户凭证的客户端,避免攻击者滥用偷得的刷新Token。改变单一的客户端凭证比作废全部刷新Token快得多。
- 实现鉴权管理最佳实践,需要定期凭证流转。实现全部刷新Token的流转是很具挑战的,相比实现一组用户凭着的流转更容易。
向Token端点发起请求时客户单可使用”client_id”的参数表明其身份。发起“授权码”、“授权类型”的请求时,未鉴权的客户端必须发送“client_id”以免接受了本应该发给另一个客户单的信息。
3.3 Access Token Scope(Access Token范围)
授权和Token端点允许客户端使用“scope”参数指明请求的访问范围。反之,权限服务器在响应中使用“scope”参数指明所发布的token的范围。
“scope”的值使用空格分隔、大小写敏感的字符串列表表示。如果列表包含多条空格分隔,它们是顺序无关的,并且每条记录指示一个范围。
scope = scope-token *( SP scope-token )
scope-token = 1*( %x21 / %x23-5B / %x5D-7E )
权限服务器可以全部或者部分的忽略客户端请求的范围,取决于全新服务器的策略或者资源拥有者的指令。如果响应范围和请求范围不同,权限服务器必须包含“scope”参数指明其发布的access token范围。
如果客户端请求省略了“scope”参数,服务器必须按照预设的范围或者失败本次请求。权限服务器应该文档化其的范围和默认值。