OpenID Connect Core 1.0(七)使用混合流验证
3.3 使用混合流验证(Authentication using the Hybrid Flow)
本节描述如何使用混合流执行验证。当使用混合流(Hybrid Flow)时一些令牌从授权端点返回,另一些则从令牌端点返回。混合流中返回令牌的机制在OAuth 2.0多响应类型编码实践中指定[OAuth. responses]。
3.3.1 混合流程的步骤(Hybrid Flow Steps)
混合流程遵循以下步骤:
1、客户准备一个包含所需的验证请求的请求参数。
2、客户端发送请求到授权服务器。
3、授权服务器验证用户。
4、授权服务器获得用户同意/授权。
5、授权服务器将终端用户发送给回客户端一个授权码,根据响应类型,返回一个或多个额外的参数。
6、客户端使用的这个授权码到令牌终结点请求响应。
7、客户端接收到包含一个ID Token和Access Token的body响应。
8、客户端验证ID Token和检索终端用户的 Subject 标识符。
3.3.2 授权终结点(Authorization Endpoint)
当使用混合流程,使用授权的终结点,是以3.1.2节定义的授权码流程的一样的方式使用授权的终结点,除了在本节中指定的差异。
3.3.2.1 验证请求(Authentication Request)
验证请求是由3.1.2.1节中定义 ,除了以下使用的验证请求参数:
response_type
必需的。确定要使用的授权处理流的OAuth 2.0响应类型值,包括从使用的端点返回的参数。当使用混合流程,此值是“code id_token” ,“code token”,或“code id_token token”。这些值定义在 OAuth 2.0 Multiple Response Type Encoding Practices [OAuth.Responses]。
下面是一个使用混合流的非规范示例请求,该混合流将由用户代理发送到授权服务器,以响应客户机相应的HTTP 302重定向响应(换行仅为显示):
GET /authorize?
response_type=code%20id_token
&client_id=s6BhdRkqt3
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
&scope=openid%20profile%20email
&nonce=n-0S6_WzA2Mj
&state=af0ifjsldkj HTTP/1.1
Host: server.example.com
3.3.2.2 验证请求验证(Authentication Request Validation)
当使用混合流程,验证请求的验证方式与第3.1.2.2节中定义的授权代码流相同。
3.3.2.3 授权服务器验证用户(Authorization Server Authenticates End-User)
当使用混合流程,终端用户身份验证的执行方式与第3.1.2.3节中定义的授权代码流相同。
3.3.2.4授权服务器获得用户同意/授权(Authorization Server Obtains End-User Consent/Authorization)
当使用混合流程,最终用户同意的获得方式与第3.1.2.4节中定义的授权代码流相同。
3.3.2.5成功的验证响应(Successful Authentication Response)
当使用混合流程,以隐式流程3.2.2.5节中定义的同样方式验证响应,除了在本节中指定的差异。
这些授权终结点结果的使用方式如下:
access_token
OAuth 2.0Access Token。当 response_type 使用的值是 code token,或 code id_token token返回。(token_type 值也在同样的情况下返回。)
id_token
ID Token。当 response_type 使用的值是code id_token 或 code id_token token时返回。
code
授权码。当使用混合流时,其总是返回。
下面是一个非规范化成功的响应使用混合流程的例子(换行仅为显示):
HTTP/1.1 302 Found
Location: https://client.example.org/cb#
code=SplxlOBeZQQYbYS6WxSbIA
&id_token=eyJ0 ... NiJ9.eyJ1c ... I6IjIifX0.DeWt4Qu ... ZXso
&state=af0ifjsldkj
3.3.2.6 验证错误响应(Authentication Error Response)
当使用混合流程,授权错误响应的方式与第3.1.2.6节中定义的授权代码流相同,除了在本节中指定的差异。
如果最终用户拒绝请求或最终用户身份验证失败,授权服务器必须在重定向URI的片段组件中返回错误授权响应,OAuth 2.0 (RFC6749) 4.2.2.1中定义和 OAuth 2.0多个响应类型编码实践 (OAuth.Responses) 中定义,除非指定不同的响应模式。
3.3.2.7 重定向URI片段处理(Redirect URI Fragment Handling)
当使用混合流程,重定向的URI参数处理片段与隐式流程3.2.2.7部分中定义请求相同。同时参照 15.5.3节中URI片段处理实现注意事项。
3.3.2.8 身份响应验证(Authentication Response Validation)
当使用混合流程,客户端必须验证如下响应:
1、验证的响应符合[OAuth.Responses]的第五节 。
2、遵循RFC 6749的验证规则,尤其是4.2.2和10.12部分。
3、遵循3.3.2.12验证规则,验证ID Token ,response_type 使用的值是“code id_token” 或“code id_token token”。
4、遵循3.3.2.9部分验证规则,验证IAccess Token ,当 response_type 使用的值“code token”或“code id_token token”。
5、遵循3.3.2.10部分规则,验证授权码,当 response_type使用的值是“code id_token ”或“code id_token”。
3.3.2.9 Access Token验证(Access Token Validation)
当使用混合流时,从授权终结点返回的Access Token将以与隐式流相同的方式进行验证,如3.2.2.9节中定义的那样。
3.3.2.10 授权码验证(Authorization Code Validation)
要使用ID Token验证授权结点发出的授权码,客户端应该执行以下操作:
1、用JWA 中为ID Token的JOSE报头的alg报头参数指定的哈希算法对代码的ASCII表示的八字节进行哈希。例如,如果alg是RS256,则使用的哈希算法是SHA-256。
2、取散列的最左边一半,然后对其进行base64url编码。
3. 如果ID Token中存在c_hash,则ID Token中的c_hash值必须与前一步中生成的值匹配。
3.3.2.11 ID Token
ID Token的内容如第2节所述。当使用混合流时,以下ID Token声明的这些附加要求适用于授权终结点返回的ID Token:
nonce
nonce 声明是必需。
at_hash
Access Token的哈希值。它的值是access_token值的ASCII表示的最左半哈希的base64url编码,其中使用的哈希算法是ID Token的JOSE头的alg头参数中使用的哈希算法。例如,如果alg是RS256,那么用SHA-256散列access_token值,然后取最左边的128位,base64url对其进行编码。at_hash值是一个区分大小写的字符串。
如果ID Token使用access_token值从授权终结点发出,则需要使用access_token,这是response_type值代码id_token的情况;否则,它是可选的。
c_hash
Code 的哈希值。它的值是Code的ASCII表示的最左半哈希的base64url编码,其中使用的哈希算法是ID Token的JOSE报头的alg报头参数中使用的哈希算法。例如,如果alg是HS512,用SHA-512对Code进行哈希,然后取最左边的256位,base64url对其进行编码。c_hash值是一个区分大小写的字符串。
如果ID Token是通过从授权终结点发出的Code,对于response_type值code id_token和code id_token来说,这是必需的;否则,它是可选的。
3.3.2.12 ID Token验证(ID Token Validation)
在使用混合流时,必须以与隐式流相同的方式验证从授权终结点返回的ID Token的内容,如3.2.2.11节中定义的那样。
3.3.3 令牌终结点(Token Endpoint)
在使用混合流时,令牌终结点的使用方式与第3.1.3节中定义的授权代码流相同,但本节中指定的差异除外。
3.3.3.1 令牌的请求(Token Request)
当使用混合流时,令牌请求的方式与授权代码流的方式相同,如3.1.3.1节中定义的那样。
3.3.3.2 请求令牌验证(Token Request Validation)
在使用混合流时,令牌请求的验证方式与在3.1.3.2节中定义的授权代码流相同。
3.3.3.3 成功的令牌响应
当使用混合流时,令牌响应的方式与授权代码流的方式相同,如3.1.3.3节中定义的那样。
3.3.3.4 令牌错误响应
当使用混合流时,令牌错误响应的方式与授权代码流相同,如3.1.3.4节中定义的那样。
3.3.3.5 令牌响应确认
在使用混合流时,令牌响应的验证方式与在3.1.3.5节中定义的授权代码流相同。
3.3.3.6 ID Token(ID Token)
在使用混合流时,从令牌终结点返回的ID Token的内容与从授权终结点返回的ID Token的内容相同,如3.3.2.11节中定义的那样,但本节中指定的差异除外。
如果一个ID Token从授权终结点和令牌终结点返回,对于response_type值code id_token和code id_token来说就是这样,那么iss和sub声明值在这两个ID Token中必须是相同的。任何一方中出现的关于身份验证事件的所有声明都应该出现在双方中。如果任何一个ID Token都包含关于最终用户的声明,那么在两者中出现的任何声明都应该具有相同的值。注意,出于隐私原因,OP可能选择从授权终结点返回关于最终用户的最少声明。从ID Token牌终结点返回,at_hash和c_hash声称可以省略,即使这些声明出现在从授权终结点中返回的 ID Token中,因为ID Token和Access Token值,在令牌终结点中返回时已经通过TLS加密并绑定在一起。
3.3.3.7 ID Token验证(ID Token Validation)
在使用混合流时,从令牌端点返回的ID令牌的内容必须以与在3.1.3.7节中定义的授权代码流相同的方式进行验证。
3.3.3.8 Access Token(Access Token)
如果一个从令牌的终结点的Access Token授权端返回,当 response_type 值是 “code id_token”和 “code id_token token” ,它们的值可能是相同的或者他们可能会有所不同。注意,可能会有不同的Access Token返回,这是由于两个端点的不同安全特性以及它们授予的资源的使用寿命和访问时间可能也不同。
3.3.3.9 Access Token验证(Access Token Validation)
当使用混合流时,从令牌端点返回的访问令牌将以与授权代码流相同的方式进行验证,如3.1.3.8节中定义的那样。
OpenID Connect Core 1.0(七)使用混合流验证的更多相关文章
- OpenID Connect Core 1.0(一)介绍
IdentityServer4是基于OpenID Connect and OAuth 2.0框架,OpenID Connect Core 1.0是IdentityServer4最重要的文档 By 道法 ...
- OpenID Connect Core 1.0(四)使用授权码流验证(上)
3.1 使用授权码流验证(Authentication using the Authorization Code Flow) 本节描述如何使用授权码流执行验证.当使用授权码流时,会从令牌终结点返回的所 ...
- OpenID Connect Core 1.0(九)声明(Claims)
5 声明(Claims) 这一节说明客户端如何获取关于终端用户声明和验证事件.它还定义了一组标准的基本声明配置.预定义一组可请求的声明,使用特定的scope值或能用于请求参数中的个人声明.声明可以直接 ...
- OpenID Connect Core 1.0(三)验证
OpenID Connect执行终端用户登录或确定终端用户已经登录的验证工作.OpenID Connect 使服务器以一种安全的方式返回验证结果.所以客户可以依靠它.出于这个原因,在这种情况下客户被称 ...
- OpenID Connect Core 1.0(八)从第三方发起登录
在某些情况下,登录流程由一个OpenID提供者或其他方发起,而不是依赖方(RP).在这种情况下,发起者重定向到RP在发起登录终结点,RP的请求验证请求发送到指定的OP.这个发起登录终结点可以在RP深度 ...
- OpenID Connect Core 1.0(六)使用隐式验证流
3.2 使用隐式验证流(Authentication using the Implicit Flow) 本节描述如何使用隐式流程执行验证.使用隐式流程时,所有令牌从授权终结点返回:不使用令牌终结点返回 ...
- OpenID Connect Core 1.0(五)使用授权码流验证(下)
3.1.2.6 验证错误响应(Authentication Error Response) 验证错误响应是一个OAuth 2.0授权错误响应消息,是RP发送授权请求的消息,由OP授权终结点的响应返回. ...
- OpenID Connect Core 1.0(二)ID Token
2.ID Token(ID Token) OpenID Connect主要是对OAuth 2.0 能够使得终端用户通过ID Token的数据结构进行验证.当客户端和潜在的其他请求声明,ID Token ...
- IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API
IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...
随机推荐
- Java中的数据类型转换
先来看一个题: Java类Demo中存在方法func0.func1.func2.func3和func4,请问该方法中,哪些是不合法的定义?( ) public class Demo{ float fu ...
- OpenStack 学习笔记 (三)
个人网站:臭蛋www.choudan.net 一直苦于不知道如何加入到开源社区参与开发,感受开源社区分布式协作开发和巨神们coding的魅力,特意在网上查了资料,直接指导的很少,还得的靠官网上的文档. ...
- Python中的基础数据类型
Python中基础数据类型 1.数字 整型a=12或者a=int(2),本质上各种数据类型都可看成是类,声明一个变量时候则是在实例化一个类. 整型具备的功能: class int(object): & ...
- python的enumerate函数
python的enumerate函数用于循环索引和元素 例如 foo = 'abc' for i , ch in enumerate(foo): print ch, '(%d)' % i 输出结果: ...
- 学习笔记:如何阻止Web应用存储敏感数据
在某些情况下,自定义Web应用会保存敏感(专有)数据到用户的缓存文件夹中.如果不重新架构该应用,使用Sysinternals SDelete的注销脚本是否可以确保数据完全被删除且没有任何可恢复残留呢? ...
- js 三元表达式的写法
句式一. if(a) do_a elseif(b) do_b else do_c 转化为: =>a ? do_a : b ?do_b : do_c 句式二. if(a) do_a 转化为: =& ...
- 设计模式(17) 访问者模式(VISITOR) C++实现
意图: 表示一个作用于某对象结构的各元素的操作.它使你可以再不改变各元素的类的前提下定义作用于这些元素的新操作. 动机: 之前在学校的最后一个小项目就是做一个编译器,当时使用的就是访问者模式. 在静态 ...
- Java学习---InetAddress类的学习
基础知识 1.InetAddress类 在网络API套接字,InetAddress类和它的子类型对象使用域名DNS系统,处理主机名到主机IPv4或IPv6地址的转换.如图1-1所示. 由于InetAd ...
- 利用TLE数据确定卫星轨道(1)-卫星轨道和TLE
1.卫星轨道 太空中卫星和天体在各种引力的作用下都在一定的轨道中周期转动着,但实际的轨道是很复杂的,一般的项目也达不到那么精确的需求(其实精确的卫星参数数据也不可能随便公开的),所以采用一阶近似的开普 ...
- MathUtils BigDecimal 数字工具类
package com.hxqc.basic.dependency.util; import org.apache.commons.lang.StringUtils; import java.math ...