3.2 使用隐式验证流(Authentication using the Implicit Flow)

本节描述如何使用隐式流程执行验证。使用隐式流程时,所有令牌从授权终结点返回;不使用令牌终结点返回。

隐式流程主要是由客户在浏览器中使用脚本语言实现。直接返回Access Token和ID Token到客户端,这可能会让他们接触到最终用户和应用程序,这些用户可以访问终端用户的用户代理。授权服务器不进行客户端验证。

3.2.1隐式流程步骤(Implicit Flow Steps)

隐式流程动遵循以下步骤:

1、客户准备一个包含所需的验证请求的请求参数。

2、客户端发送请求到授权服务器。

3、授权服务器验证用户。

4、授权服务器获得用户同意/授权。

5、授权服务器将终端用户返回给客户端,并使用ID Token,如果需要的话,则可以使用一个Access Token。

6、客户端验证ID Token和检索终端用户的从属标识符。

3.2.2 授权终结点(Authorization Endpoint)

当使用隐式流程时,是以3.1.2节定义的授权码流程的一样的方式使用授权的终结点,除了在本节中指出的差异。

3.2.2.1验证请求(Authentication Request)

验证请求是由3.1.2.1节中定义,除了如下验证请求参数:

response_type

必需的。OAuth 2.0授权处理流程规定的响应类型值,包括返回终结点的参数。使用隐式流时,这个值是 “id_token token” 或 “id_token” 。这两个值的含义在OAuth 2.0多个响应类型编码实践 [OAuth.Responses] 中定义。没有Access Token值时只返回 id_token 。

注意:虽然OAuth 2.0还定义了隐式流程令牌响应类型值,但OpenID Connect不使用这种响应类型,因而没有返回ID Token。

redirect_uri

必需的。将发回响应的URI重定向。这个URI必须精确匹配客户端预注册的OpenID提供者的一个重定向URI值,匹配执行在 6.2.1节 (RFC3986) (简单的字符串比较) 中描述。当使用隐式流程时,重定向的URI 不能使用 http方案,除非客户端是一个本地应用程序,在这种情况下,它可能使用 http: 主机名是localhost。

nonce

必需的。用于将客户端会话与ID Token关联起来的字符串值,并减轻重播攻击。该值在请求ID Token中是不会修改的。nonec必须足够复杂,以防止攻击者猜测。实现说明,请参阅 15.5.2节 。

下面是一个非规范化的,使用隐式流程请求示例,这将是由用户代理发送到授权服务器,为以响应客户端相应的HTTP 302重定向响应(换行仅用于显示目的):

GET /authorize?

response_type=id_token%20token

&client_id=s6BhdRkqt3

&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb

&scope=openid%20profile

&state=af0ifjsldkj

&nonce=n-0S6_WzA2Mj HTTP/1.1

Host: server.example.com

3.2.2.2验证请求验证(Authentication Request Validation)

使用隐式流程时,其验证请求,与在 3.1.2.2节中定义的授权码流程方式一致。

3.2.2.3授权服务器验证用户(Authorization Server Authenticates End-User)

使用隐式流程时,终端用户执行验证,与在 3.1.2.3节中定义的授权码流程方式一致。

3.2.2.4授权服务器获得用户同意/授权(Authorization Server Obtains End-User Consent/Authorization)

使用隐式流程时,终端用户同意,与在 3.1.2.4节中定义的授权码流程方式一致。

3.2.2.5成功的验证响应(Successful Authentication Response)

使用隐式流程时,验证响应与在 3.1.2.5节中定义的授权码流程方式一致。

使用隐式流程时,所有响应参数添加到重定向的URI片段组件中,在 OAuth 2.0有多个响应类型编码实践 (OAuth.Responses),除非指定不同的响应模式。

下列参数将从授权终端返回:

access_token

OAuth 2.0的Access Token。该值会返回,除非所使用的 response_type 值是id token。

token_type

OAuth 2.0令牌类型的值。该值必须是Bearer或另一个与授权服务器协商好了的token_type 值。客户实现这个配置,必须支持 OAuth 2.0使用的Bearer令牌 (RFC6750)规范。配置仅仅描述了使用Bearer令牌。access_token返回情况相同。

id_token

必需的。ID Token。

state

OAuth 2.0状态值。如果state参数是出现在授权请求中。客户端必须确认state值是否等于授权请求时传入的state值。

expires_in

可选的。从响应发生到Access Token过期时间的秒数。

OAuth 2.0 (RFC6749) 中4.2.2节,当使用隐式流程没有code结果返回。

下面是一个使用隐式流成功响应的非规范示例(换行仅用于显示目的):

HTTP/1.1 302 Found

Location: https://client.example.org/cb#

access_token=SlAV32hkKG

&token_type=bearer

&id_token=eyJ0 ... NiJ9.eyJ1c ... I6IjIifX0.DeWt4Qu ... ZXso

&expires_in=3600

&state=af0ifjsldkj

3.2.2.6验证错误响应(Authentication Error Response)

当使用隐式流程,授权错误响应与在 3.1.2.6节中定义的授权码流程方式一致。

如果最终用户拒绝了请求,或者终端用户身份验证失败,授权服务器必须在重定向URI的片段组件中返回错误授权响应,OAuth 2.0 (RFC6749) 4.2.2.1中定义的和 OAuth 2.0多个响应类型编码实践 (OAuth.Responses),除非指定不同的响应模式。

3.2.2.7重定向URI片段处理(Redirect URI Fragment Handling)

由于响应参数在重定向URI片段值中返回,所以客户端需要让用户代理解析片段编码的值,并将其传递给客户端的处理逻辑以供消费。有关URI片段处理的实现说明,请参阅第15.3节。

3.2.2.8验证响应验证(Authentication Response Validation)

使用隐式流程时,客户端必须验证响应如下:

1、验证的响应符合第五节 (OAuth.Responses) 。

2、遵循RFC 6749的验证规则,尤其是4.2.2和10.12部分。

3、按照3.2.2.11部分的ID Token验证规则。

4、按照3.2.2.9部分的Access Token验证规则,除非 response_type 使用的值是 id_token。

3.2.2.9 Access Token验证(Access Token Validation)

要验证带有ID Token的授权端点发出的Access Token,客户端应该做到以下几点:

1、用JWA 中指定的哈希算法对access_token的ASCII表示进行散列计算,以获得ID令牌的JOSE Header的alg头参数。例如,如果alg是RS256,那么使用的散列算法是SHA-256。

2、取最左边的一半哈希和base64url编码。

3、ID令牌中的at_hash值必须与上一步中生成的值相匹配。

3.2.2.10 ID Token(ID Token)

ID Token的内容在第二节中描述。使用隐式流程时,要求以下额外的声明申请ID Token:

nonce

使用 nonce 声明在隐式流中是必需。

at_hash

Access Token 散列值。它的值是base64url编码,它是 access_token  值的ASCII表示的八进制散列中最左半部分的编码,其中使用的散列算法是在ID令牌的JOSE 标头的alg头参数中使用的散列算法。例如,如果alg是RS256,用SHA-256将 access_token  值哈希,然后用最左边的128位和base64url编码它们。at_hash值是一个大小写敏感字符串。

如果带有 access_token值的 ID Token从授权端点颁发 ,当response_type值是id_token token,这是必需的;当response_type值是id_token时 access_token不会使用。

3.2.2.11 ID Token验证(ID Token Validation)

使用隐式流程时,必须以3.1.3.7中定义授权码流程的同样方式验证ID Token的内容,除了在本节中指定的差异。

1、客户端必须使用JWS的方法来验证 ID Token 的签名,其算法是在JOSE Header的alg头参数中指定。。

2. 必须检查nonce 声明值,以验证它是否与在认证请求中发送的值相同。客户端应该检查nonce值以防止重放攻击。检测重放攻击的精确方法用于特定客户端的。

OpenID Connect Core 1.0(六)使用隐式验证流的更多相关文章

  1. OpenID Connect Core 1.0(七)使用混合流验证

    3.3 使用混合流验证(Authentication using the Hybrid Flow) 本节描述如何使用混合流执行验证.当使用混合流(Hybrid Flow)时一些令牌从授权端点返回,另一 ...

  2. OpenID Connect Core 1.0(一)介绍

    IdentityServer4是基于OpenID Connect and OAuth 2.0框架,OpenID Connect Core 1.0是IdentityServer4最重要的文档 By 道法 ...

  3. OpenID Connect Core 1.0(四)使用授权码流验证(上)

    3.1 使用授权码流验证(Authentication using the Authorization Code Flow) 本节描述如何使用授权码流执行验证.当使用授权码流时,会从令牌终结点返回的所 ...

  4. OpenID Connect Core 1.0(五)使用授权码流验证(下)

    3.1.2.6 验证错误响应(Authentication Error Response) 验证错误响应是一个OAuth 2.0授权错误响应消息,是RP发送授权请求的消息,由OP授权终结点的响应返回. ...

  5. OpenID Connect Core 1.0(三)验证

    OpenID Connect执行终端用户登录或确定终端用户已经登录的验证工作.OpenID Connect 使服务器以一种安全的方式返回验证结果.所以客户可以依靠它.出于这个原因,在这种情况下客户被称 ...

  6. OpenID Connect Core 1.0(九)声明(Claims)

    5 声明(Claims) 这一节说明客户端如何获取关于终端用户声明和验证事件.它还定义了一组标准的基本声明配置.预定义一组可请求的声明,使用特定的scope值或能用于请求参数中的个人声明.声明可以直接 ...

  7. OpenID Connect Core 1.0(八)从第三方发起登录

    在某些情况下,登录流程由一个OpenID提供者或其他方发起,而不是依赖方(RP).在这种情况下,发起者重定向到RP在发起登录终结点,RP的请求验证请求发送到指定的OP.这个发起登录终结点可以在RP深度 ...

  8. OpenID Connect Core 1.0(二)ID Token

    2.ID Token(ID Token) OpenID Connect主要是对OAuth 2.0 能够使得终端用户通过ID Token的数据结构进行验证.当客户端和潜在的其他请求声明,ID Token ...

  9. IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API

    IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...

随机推荐

  1. Zookeeper JAVA API的使用

    0. 前言 zookeeper安装及使用  http://www.cnblogs.com/rocky-fang/p/7880309.html 1. 开发环境配置 1.1 idea创建一个maven工程 ...

  2. iframe在移动端的缩放

    工作中碰到个奇怪的问题,折腾了大半天,终于算是解决了,这里把分析思路和解决办法记录下. 项目是做响应式的公司官网,前期的静态图页面切完后就提交给后台作为模板使用了,我也就基本退出项目. 在后端落地时发 ...

  3. lnmp环境 开启pathinfo

    thinkphp url访问模式中 默认的pathinfo不起作用? 1.检查你的tp配置文件config.php URL模式 'url_model'=> '1', //URL模式 即pathi ...

  4. C语言——链式存储实现栈的基本运算算法

    Lkstack.h // 链栈的定义 typedef struct node { int data; struct node *next; }LkStk; main.c #include <st ...

  5. C++学习笔记(7)----类的数组中构造函数和析构函数的调用顺序

    C++类的数组中构造函数和析构函数的调用顺序(2) 对于如下的代码: #include<iostream> using namespace std; class CBase { priva ...

  6. C语言中关键词static的用法与作用域

    一.面向过程设计中的static 转载:http://blog.csdn.net/celerylxq/article/details/6160499 1.静态全局变量 在全局变量前,加上关键字stat ...

  7. package.json作用

    这个文档的内容是你必须要知道的,它必须是JSON文本格式.每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称.版本.许可证等元 ...

  8. Sys.WebForms.PageRequestManagerParserErrorException: 常见的原因是:通过调用Response.Write()修改相应时,将启用响应筛选器、HttpModules或服务器追踪

    Sys.WebForms.PageRequestManagerParserErrorException: 无法分析从服务器收到的消息,之所以出现此错误,常见的原因是:通过调用Response.Writ ...

  9. 沉淀再出发:java中的CAS和ABA问题整理

    沉淀再出发:java中的CAS和ABA问题整理 一.前言 在多并发程序设计之中,我们不得不面对并发.互斥.竞争.死锁.资源抢占等等问题,归根到底就是读写的问题,有了读写才有了增删改查,才有了所有的一切 ...

  10. August 07th 2017 Week 32nd Monday

    Life is just a series of trying to make up your mind. 生活只是由一系列下决心的努力所构成. Some people say it is not y ...