OAuth 2.0 实战课
王新栋
京东资深架构师
16397 人已学习
新⼈⾸单¥29
登录后,你可以任选2讲全文学习
课程目录
已完结/共 17 讲
开篇词 (1讲)
OAuth 2.0 实战课
15
15
1.0x
00:00/00:00
登录|注册

09 | 实战:利用OAuth 2.0实现一个OpenID Connect用户身份认证协议

你好,我是王新栋。
如果你是一个第三方软件开发者,在实现用户登录的逻辑时,除了可以让用户新注册一个账号再登录外,还可以接入微信、微博等平台,让用户使用自己的微信、微博账号去登录。同时,如果你的应用下面又有多个子应用,还可以让用户只登录一次就能访问所有的子应用,来提升用户体验。
这就是联合登录和单点登录了。再继续深究,它们其实都是 OpenID Connect(简称 OIDC)的应用场景的实现。那 OIDC 又是什么呢?
今天,我们就来学习下 OIDC 和 OAuth 2.0 的关系,以及如何用 OAuth 2.0 来实现一个 OIDC 用户身份认证协议。

OIDC 是什么?

OIDC 其实就是一种用户身份认证的开放标准。使用微信账号登录极客时间的场景,就是这种开放标准的实践。
说到这里,你可能要发问了:“不对呀,使用微信登录第三方 App 用的不是 OAuth 2.0 开放协议吗,怎么又扯上 OIDC 了呢?”
没错,用微信登录某第三方软件,确实使用的是 OAuth 2.0。但 OAuth2.0 是一种授权协议,而不是身份认证协议。OIDC 才是身份认证协议,而且是基于 OAuth 2.0 来执行用户身份认证的互通协议。更概括地说,OIDC 就是直接基于 OAuth 2.0 构建的身份认证框架协议。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了如何利用OAuth 2.0实现OpenID Connect(OIDC)用户身份认证协议。文章首先解释了OIDC是基于OAuth 2.0构建的身份认证框架协议,是OAuth 2.0的超集。通过对比OAuth 2.0的授权码许可流程和OIDC的通信流程,阐述了OIDC协议流程几乎与OAuth 2.0中的授权码许可的流程完全一致,但多返回了一个ID_TOKEN,即ID令牌,是身份认证的关键。文章通过清晰的角色对应关系图和通信流程图,帮助读者深入理解了OIDC和OAuth 2.0之间的关系,以及如何利用OAuth 2.0来实现OIDC的身份认证协议。此外,还介绍了ID令牌的生成和解析方法,以及如何利用访问令牌获取ID令牌之外的信息。最后,文章提到了如何利用OIDC实现单点登录的方法。总的来说,本文为开发者和技术人员提供了清晰的技术指导和实践应用的思路,帮助他们深入了解身份认证协议的原理和实现方法。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《OAuth 2.0 实战课》
新⼈⾸单¥29
立即购买
登录 后留言

全部留言(57)

  • 最新
  • 精选
  • 哈德韦
    还是没有搞懂 id_token 的用处是什么…… 1. 客户端需要解析 id_token 的话,需要和服务器端共享密钥,这怎么解决?会不会造成密钥泄漏? 2. 如果只是解析出一些用户信息,发请求给服务器,服务器用 access_token 拿到用户信息,返回给客户端,不是也行吗?只要 access_token 没过期(即还在登录态),客户端就能拿到用户信息。 3. 如果 access_token 过期(即登录已失效),客户端仍然可以用 id_token 解析出用户信息,这岂不是更不合理?

    作者回复: id_token是用户身份令牌、access_token是访问令牌,这两个一定要区别开,access_token永远不能被任何第三方软件去解析,就是一个令牌,用来后续请求受保护资源。 1、id_token是包含代表用户身份信息的声明,access_token是访问受保护资源的凭证,是用来请求平台上资源的,id_token的秘钥可以通过access_token来请求获取,如果access_token也使用JWT格式的数据,两个秘钥肯定不会相同。 2、ID令牌id_token是在访问令牌access_token基础上的补充,而不是替换访问令牌。“这是因为这两种令牌有不同的目标受众和用途。这种双令牌的方式可以让访问令牌在常规的OAuth 2.0中那样继续保持对第三方软件不透明,而让ID令牌能够被解析。而且,这两种令牌还具有不同的生命周期,ID令牌通常会很快过期。ID令牌代表一个单独的身份认证结果,并且永远不会传递给外部服务,而访问令牌可以在用户离开后的很长时间内用于获取受保护资源。”比如举个例子小明使用了小兔打单软件的批量导出订单功能,如果耗时相对比较长,小明不必一直在场。 3、id_token和access_token没有关系,access_token过期用refresh_token刷新,只是在第一次登陆的时候将它们两个同时返回给了三方软件,id_token的使命本身就是用来标识用户的,这个标识不是用户名,用户登录的时候用的是用户名而不是这个id_token。 OIDC是在OAuth 2.0 的基础上产生的。

    2020-07-18
    7
    18
  • 工资不交税
    在应用oss中,一端退出是不是还需要通知认证服务?不然认证服务的状态还是登录,那其他端还是能直接登录,甚至自己都没法退出。

    作者回复: 要通知

    2020-07-21
    8
    11
  • DB聪
    图3中”重复上述1-6”陈述单点登录的描述感觉有点难理解,原因在第3步,如果分别登陆a1.com、a2.com、a3.com的时候,都有第3步的参与,那是否意味着End User每次都需要输入用户名和密码呢?

    作者回复: 重复1-6的本意是要表达都需要进行1-6步骤,在图中我们分了已登录和未登录两种情况,那个步骤3是在未登录的情况下发生的。

    2020-07-18
    9
    8
  • 成立-Charlie
    老师,您好!关于ID Token和Access Token,还需要再请教一下。 如果Access Token没有使用JWT,第三方应用无法从Access Token中获取用户信息,这样我们就需要ID Token来存放用户信息,这比较容易理解。但是,如果Access Token是JWT格式的,第三方应用是可以从Access Token中解析出用户信息的,再使用ID Token显得不是很有必要。(JWT可以采用非对称证书的方式保证安全)这块老师能帮忙稍微再解释一下吗,谢谢! 另外,当我们继承一个认证服务的时候,ID Token是我们评断认证服务是否实现OIDC的标准吗?

    作者回复: Access Token 无论什么格式的都不能被第三方软件解析,永远不透明。 ID Token是OIDC在OAuth2.0的基础上实现身份认证的产物,从某个意义上讲可以这样理解,但实际上实现一个OIDC还需要实现RP 和 OP。

    2020-08-06
    4
    7
  • leros
    能不能比较下基于SAML和基于OIDC的SSO?一些大的授权服务平台可能二者都提供,不太清楚具体实践中如何选择

    作者回复: 像Kerberos、SAML这些的特点就是复杂,至少相对于OAuth 2.0 要复杂的多,现在基于OAuth 2.0的OIDC是趋势。

    2020-07-19
    6
  • stubborn
    老师您好,两个问题请教下。 1. access_token失效了可以用refresh_token重新获取。id_token失效了怎么办,这块有没有规范? keycloak的实现中使用refresh_token可以重新生成id_token。 2. Oauth2其实也可以实现认证的功能,只要把access_token定义包含认证信息就可以了,这样使用access-token就类似id_token了。不太明白为何OIDC需要突出这部分的定义?

    作者回复: id_token是想客户端证明用户是谁,已通过身份认证。这个问题有一个假设就是”ID令牌和访问令牌应同时使用“,这是不对的。 关于access_token和id_token的区别: 第一,ID 令牌是对访问令牌的补充,而不是要替换访问令牌。之所以采用这样双令牌的方式,就是想让早先存在的访问令牌,可以在 OAuth 2.0 中继续保持对第三方软件的不透明性,而让后来新增的 ID 令牌要能够被解析,目的就是方便应用到身份认证协议中。 第二,ID 令牌和访问令牌有不同的生命周期,ID 令牌的生命周期相对来说更短些。因为 ID 令牌的作用就是代表一个单独的身份认证结果,它的使命就是用来标识用户的。而这个标识并不是用户名,用户登录的时候用的是用户名而不是这个 ID 令牌,所以如果用户注销或者退出了登录,ID 令牌的生命周期就随之结束了。 访问令牌可以在用户离开后的很长时间内,继续被第三方软件用来请求受保护资源服务。比如,小明使用了小兔打单软件的批量导出订单功能,如果耗时相对比较长,小明不必一直在场。

    2020-08-16
    2
    4
  • 哈德韦
    传统的登录基于Session,是不是使用JWT Token方案,就不需要Session了(也不需要Cookie参与了)?

    作者回复: 是的

    2020-07-19
    4
    4
  • 往事随风,顺其自然
    代码中access_token中就包含用户信息,获取accesstoken 时候需要带上id_token中的用户唯一标识?

    作者回复: 无论普通的access_token还是JWT格式的access_token,归根结底还是【访问令牌】,访问令牌永远对第三方软件不透明,JWT格式的access_token包含用户信息,也是在当第三方软件请求到受保护资源的时候,受保护资源去解析识别。 id_token是我们说的OIDC这样的协议在OAuth 2.0的基础上增加的一个可以包含用户ID属性的事物。

    2020-07-18
    5
    3
  • 哈德韦
    前面的课程里讲到,一般来说 JWT 有个缺陷,为了克服“覆水难收”,需要一个额外的用户粒度的密钥管理。那么,这个用户粒度的密钥管理是针对 access_token 的吗?id_token 的密钥,也需要到用户粒度吗?

    作者回复: 是的,在04中我们指的是access_token,那个时候还没有接触和提到ID_TOKEN。 id_token 的密钥的粒度,这个要结合我们自己对安全要求的级别来对待,粒度一般是有这样几种,到第三方软件应用级别粒度,到第三方软件应用的用户级别粒度。实际上id_token的安全要求是要比access_token的低。

    2020-07-19
    2
  • 在路上
    王老师,单点登录的步骤中,a2.com需要去解析,id_token的 ID值么?

    作者回复: 需要的,a2.com要识别用户标识,需要解析id_token的值。

    2020-07-21
    1
收起评论
显示
设置
留言
57
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部