学习极客时间王新栋的《OAuth 2.0实战课》笔记:实战:利用OAuth 2.0实现一个OpenID Connect用户身份认证协议。

OIDC 是什么?

OIDC 其实就是一种用户身份认证的开放标准。使用微信账号登录极客时间的场景,就是这种开放标准的实践。

OIDC= 授权协议 + 身份认证

OAuth 2.0 的授权码许可流程的运转,需要资源拥有者、第三方软件、授权服务、受保护资源这 4 个角色间的顺畅通信、配合才能够完成,
在 OIDC 的官方标准框架中,EU、RP 和 OP 这三个角色对于 OIDC 非常重要:

  • EU(End User),代表最终用户。
  • RP(Relying Party),代表认证服务的依赖方,就是上面我提到的第三方软件。
  • OP(OpenID Provider),代表提供身份认证服务方。

借助极客时间的例子,来看一下 OAuth 2.0 的 4 个角色和 OIDC 的 3 个角色之间的对应关系:

OIDC 和 OAuth 2.0 的关键区别

OIDC 就是基于 OAuth 2.0 来实现的一个身份认证协议框架,OIDC 的通信流程图帮助理解OIDC 和 OAuth 2.0 的关系:

一个基于授权码流程的 OIDC 协议流程,跟 OAuth 2.0 中的授权码许可的流程几乎完全一致,唯一的区别就是多返回了一个 ID_TOKEN,我们称之为 ID 令牌。这个令牌是身份认证的关键。

OIDC 中的 ID 令牌生成和解析方法

在上面图 2 的 OIDC 通信流程的第 6 步,我们可以看到 ID 令牌(ID_TOKEN)和访问令牌(ACCESS_TOKEN)是一起返回的。,令牌不需要被第三方软件解析,因为它对第三方软件来说是不透明的。但 ID 令牌需要能够被第三方软件解析出来,因为第三方软件需要获取 ID 令牌里面的内容,来处理用户的登录态逻辑。
ID 令牌的内容是什么呢?
5 个 JWT 声明参数也是必须要有的。

  • iss,令牌的颁发者,其值就是身份认证服务(OP)的 URL。
  • sub,令牌的主题,其值是一个能够代表最终用户(EU)的全局唯一标识符。
  • aud,令牌的目标受众,其值是三方软件(RP)的 app_id。
  • exp,令牌的到期时间戳,所有的 ID 令牌都会有一个过期时间。
  • iat,颁发令牌的时间戳。
    实例代码如下:

//GENATE ID TOKEN
String id_token=genrateIdToken(appId,user);private String genrateIdToken(String appId,String user){String sharedTokenSecret="hellooauthhellooauthhellooauthhellooauth";//秘钥Key key = new SecretKeySpec(sharedTokenSecret.getBytes(),SignatureAlgorithm.HS256.getJcaName());//采用HS256算法Map<String, Object> headerMap = new HashMap<>();//ID令牌的头部信息headerMap.put("typ", "JWT");headerMap.put("alg", "HS256");Map<String, Object> payloadMap = new HashMap<>();//ID令牌的主体信息payloadMap.put("iss", "http://localhost:8081/");payloadMap.put("sub", user);payloadMap.put("aud", appId);payloadMap.put("exp", 1584105790703L);payloadMap.put("iat", 1584105948372L);return Jwts.builder().setHeaderParams(headerMap).setClaims(payloadMap).signWith(key,SignatureAlgorithm.HS256).compact();
}

ID 令牌才是 OIDC 作为身份认证协议的关键所在。那么有了 ID 令牌后,第三方软件应该如何解析它呢?


private Map<String,String> parseJwt(String jwt){String sharedTokenSecret="hellooauthhellooauthhellooauthhellooauth";//密钥Key key = new SecretKeySpec(sharedTokenSecret.getBytes(),SignatureAlgorithm.HS256.getJcaName());//HS256算法Map<String,String> map = new HashMap<String, String>();Jws<Claims> claimsJws = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(jwt);//解析ID令牌主体信息Claims body = claimsJws.getBody();map.put("sub",body.getSubject());map.put("aud",body.getAudience());map.put("iss",body.getIssuer());map.put("exp",String.valueOf(body.getExpiration().getTime()));map.put("iat",String.valueOf(body.getIssuedAt().getTime()));return map;}

OIDC 的流程
细粒度地去看 OIDC 的流程就是:生成 ID 令牌 -> 创建 UserInfo 端点 -> 解析 ID 令牌 -> 记录登录状态 -> 获取 UserInfo。

单点登录
记录一下常用的单点登录的交易流程

一个用户 G 要登录第三方软件 A,A 有三个子应用,域名分别是 a1.com、a2.com、a3.com。如果 A 想要为用户提供更流畅的登录体验,让用户 G 登录了 a1.com 之后也能顺利登录其他两个域名,就可以创建一个身份认证服务,来支持 a1.com、a2.com 和 a3.com 的登录。:

OAuth 2.0实战课 09 笔记相关推荐

  1. OAuth 2.0实战课 08 笔记

    学习极客时间王新栋的<OAuth 2.0实战课>笔记. OAuth2.0可能导致的安全漏洞 CSRF 攻击 CSRF 的定义,<OAuth 2 in Action>这本书里的解 ...

  2. OAuth 2.0实战课 10 笔记

    学习极客时间王新栋的<OAuth 2.0实战课>笔记:实战案例:使用Spring Security搭建一套基于JWT的OAuth 2.0架构 跟随文刊做一个spring security ...

  3. OAuth 2.0实战课04-06笔记

    JWT令牌 JWT 就是用一种结构化封装的方式来生成 token 的技术. 这种结构化体可以分为 HEADER(头部).PAYLOAD(数据体)和 SIGNATURE(签名)三部分.如下图: JWT如 ...

  4. OAuth 2.0实战(一)-通俗光速入门

    1 什么是开放平台(Open Platform) 在软件行业和网络中,开放平台指软件系统通过公开其API使外部程序可增加该软件系统的功能或使用该软件系统的资源,而无需更改该软件系统的源码. 在互联网时 ...

  5. OAuth 2.0——授权服务开发笔记(一)

    一.概念 OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版.因为1.0版设计的很繁琐,所以被抛弃了. OAuth 协议为用户资源的授权提 ...

  6. DDD实战课--学习笔记

    目录 学好了DDD,你能做什么? 领域驱动设计:微服务设计为什么要选择DDD? 领域.子域.核心域.通用域和支撑域:傻傻分不清? 限界上下文:定义领域边界的利器 实体和值对象:从领域模型的基础单元看系 ...

  7. OAuth 2.0——授权服务开发笔记(二)

    客户端的授权模式详解 授权码模式: 授权码模式(authorization code)是功能最完整.流程最严密的授权模式.它的特点就是通过客户端的后台服务器,与"服务提供商"的认证 ...

  8. B端产品实战课读书笔记05:第四章需求调研

    目录 一.调研准备 1.提炼原始信息 2.设定调研目标 2.1价值共识 2.2需求共识 2.3理解共识 3.规范调研准则 3.1全程参与 3.2相互尊重 3.3聚焦问题 3.4开放包容 二.快速掌握业 ...

  9. OAuth 2.0 笔记 (1) 世界观

    OAuth 2.0笔记(1)世界观 来自台湾同胞的博客:https://blog.yorkxin.org/posts/oauth2-1-introduction.html,繁体字做了复制转换. 最近需 ...

最新文章

  1. 美国年薪最高的高管是谁?彭博最新薪酬排名出炉,库克只排第二
  2. 写出一个超强的lighttpd模块
  3. Linux的磁盘管理
  4. Linux数据报文接收发送总结2
  5. 【TensorFlow】ValueError: Shape must be rank 1 but is rank 0 for ' ’ with input shapes: [].问题
  6. Web网站架构设计(转)
  7. Java猿面试_猿灯塔:关于Java面试,你应该准备这些知识点
  8. mysql 锁怎么使用_Mysql锁一般使用
  9. CompletableFuture详解~thenCombine
  10. 仿QQ聊天室【方案】
  11. 全国专业技术人员计算机应用能力考试题,2017年全国专业技术人员计算机应用能力考试题库...
  12. C# 中的DevExpress CheckedListBoxControl控件
  13. hiho 第1周 最长回文子串
  14. grafana安装配置 influxdb安装配置
  15. 使用Arduino Pro Mini和BC95-B5连接物联网
  16. Python笔记-面向对象
  17. 死亡测试 - GoogleTest(五)
  18. 高拍仪拍照SDK开发(良田影像S300L|S500L)
  19. 针式 PKM 个人知识管理软件 视频简介
  20. 支配节点树及其构建算法 Dominator-tree and its Construction Algorithms

热门文章

  1. windows蓝牙卡顿
  2. wps文件一点打印就关闭打印机服务器,一点击打印WPS就异常关闭是怎么回事
  3. Excel 分类查看数据的坑,你还只是会筛选数据吗? 来试试分类汇总吧
  4. DTCloud 企业中台
  5. mysql有关运维的面试题_mysql数据库运维面试题
  6. java中匿名内部类实现接口_java中的匿名内部类是成员内部类吗?我就很不明白为什么造一个接口的时候匿名内部类是怎么去实现接口的...
  7. 服务器无盘启动慢什么情况,网吧无盘系统电脑启动慢是怎么回事?
  8. 有枚举他不用,非要把值写死——为什么有些大公司技术弱爆了?
  9. php 三元运算?:和合并运算符??
  10. 用doctype激活浏览器模式