OAuth 2.0实战课
王新栋
京东资深架构师
新⼈⾸单¥9.9
2539 人已学习
课程目录
已完结 17 讲
0/2登录后,你可以任选2讲全文学习。
开篇词 (1讲)
开篇词 | 为什么要学OAuth 2.0?
免费
基础篇 (6讲)
01 | OAuth 2.0是要通过什么方式解决什么问题?
02 | 授权码许可类型中,为什么一定要有授权码?
03 | 授权服务:授权码和访问令牌的颁发流程是怎样的?
04 | 在OAuth 2.0中,如何使用JWT结构化令牌?
05 | 如何安全、快速地接入OAuth 2.0?
06 | 除了授权码许可类型,OAuth 2.0还支持什么授权流程?
进阶篇 (8讲)
07 | 如何在移动App中使用OAuth 2.0?
08 | 实践OAuth 2.0时,使用不当可能会导致哪些安全漏洞?
09 | 实战:利用OAuth 2.0实现一个OpenID Connect用户身份认证协议
10 | 串讲:OAuth 2.0的工作流程与安全问题
11 | 实战案例:使用Spring Security搭建一套基于JWT的OAuth 2.0架构
12 | 架构案例:基于OAuth 2.0/JWT的微服务参考架构
13 | 各大开放平台是如何使用OAuth 2.0的?
14 | 查漏补缺:OAuth 2.0 常见问题答疑
结束语 (2讲)
期末测试 | 一套习题,测试你的掌握程度
结束语 | 把学习当成一种习惯
OAuth 2.0实战课
15
15
1.0x
00:00/00:00
登录|注册

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

王新栋 2020-07-18
你好,我是王新栋。
如果你是一个第三方软件开发者,在实现用户登录的逻辑时,除了可以让用户新注册一个账号再登录外,还可以接入微信、微博等平台,让用户使用自己的微信、微博账号去登录。同时,如果你的应用下面又有多个子应用,还可以让用户只登录一次就能访问所有的子应用,来提升用户体验。
这就是联合登录和单点登录了。再继续深究,它们其实都是 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《OAuth 2.0实战课》,如需阅读全部文章,
请订阅文章所属专栏新⼈⾸单¥9.9
立即订阅
登录 后留言

精选留言(25)

  • 哈德韦
    还是没有搞懂 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
    3
  • 成立-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
    1
    2
  • 工资不交税
    在应用oss中,一端退出是不是还需要通知认证服务?不然认证服务的状态还是登录,那其他端还是能直接登录,甚至自己都没法退出。

    作者回复: 要通知

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

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

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

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

    2020-07-18
    4
    2
  • 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
    1
  • 在路上
    王老师,单点登录的步骤中,a2.com需要去解析,id_token的 ID值么?

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

    2020-07-21
    1
  • 冷锋
    CAS和SSO有什么区别?

    作者回复: CAS是实现SSO的一种方式,如果是保护的服务端资源,当然OAuth是最好的选择。

    2020-07-20
    1
  • 许灵
    好像现在的第三方登录都是通过access_token来获取用户信息的,这是不是表示access_token与id_token合并了?

    作者回复: access_token与id_token不会合并,它们分别代表了两个用途的事物,id_token表示身份认证,是一个用户标识,用户退出登录id_token随机失效,但是access_token只要不过期还是会被第三方软件用来请求访问受保护资源的。

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

    作者回复: 是的

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

    作者回复: 是的,在04中我们指的是access_token,那个时候还没有接触和提到ID_TOKEN。

    id_token 的密钥的粒度,这个要结合我们自己对安全要求的级别来对待,粒度一般是有这样几种,到第三方软件应用级别粒度,到第三方软件应用的用户级别粒度。实际上id_token的安全要求是要比access_token的低。

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

    作者回复: 无论普通的access_token还是JWT格式的access_token,归根结底还是【访问令牌】,访问令牌永远对第三方软件不透明,JWT格式的access_token包含用户信息,也是在当第三方软件请求到受保护资源的时候,受保护资源去解析识别。

    id_token是我们说的OIDC这样的协议在OAuth 2.0的基础上增加的一个可以包含用户ID属性的事物。

    2020-07-18
    3
    1
  • 往事随风,顺其自然
    userinfo 端点是啥意思,就是请求时候,access _token会带上用户唯一标识?app_id算不算唯一标识,和用户绑定关系

    作者回复: userinfo 端点,授权端点、令牌端点都是OAuth 2.0协议里面的惯用叫法,这里的userinfo 端点表示的是平台一方支持获取详细用户信息的地方。

    app_id是第三方软件的标识。

    2020-07-18
    1
    1
  • Younger Ku
    第四节讲JWT令牌的时候有这么一句话:“授权服务“扔出”一个令牌,受保护资源服务“接住”这个令牌,然后自己开始解析令牌本身所包含的信息就可以了,而不需要再去查询数据库或者请求 RPC 服务。”其中提到了解析令牌本身的概念,授权服务和受保护资源服务之间传递的令牌不就是访问令牌吗?但是本节课说访问令牌是不需要解析的,可能因为这个导致评论中好多人包括我感到困惑吧
    2020-08-18
  • Younger Ku
    “我们知道,访问令牌不需要被第三方软件解析,因为它对第三方软件来说是不透明的。但 ID 令牌需要能够被第三方软件解析出来,因为第三方软件需要获取 ID 令牌里面的内容,来处理用户的登录态逻辑。”文中这句话里面的“对第三方软件来说是不透明的”是不是应该是透明的,也就是看不见的。请老师指教。
    2020-08-18
  • 饭粒
    老师,您好,有点疑问:
    1.单点登录流程那里,用户从 a1 登录后,第三方软件访问 a2, a3 时需要携带什么信息供客户端进行登录状态的判断?id_token 吗?
    2.如果不是第三方软件访问 a2, a3,而是浏览器访问,比如登录淘宝后,访问天猫,这样的单点登录的过程?
    2020-08-13
  • 我行我素
    OIDC的单点登陆,如果重复1-6的步骤那么虽然不用重新点击登陆,但是页面会来回转换,这样是有感的,怎么样才能无感呢
    2020-08-05
  • lign
    老师,您好!
    文中使用code去拿令牌时,只返回了ID_TOKEN、ACCESS_TOKEN,没有REFRUSH_TOKEN。当第三方软件session过期后,用什么令牌去交换新ID_TOKEN、ACCESS_TOKEN?还是第三方软件重定向到认证服务后,要求用户必须重新登陆?实际上,此时,服务可能并没有退出,还处于登陆状态。重新登陆的话,可能会造成用户有多个登陆数据
    2020-08-04
  • lign
    老师,您好!
    文中提到a1.com a2.com等第三方软件都需要处理各自的登陆状态。如果第三方软件采用微服务架构,后面有多个实例,是不是第三方软件需要登陆状态共享?保证登陆用户的请求分配任意一个实例上时,都是登陆的状态?有没有什么好的解决方案?
    2020-08-04
  • 贺宇
    这么说想要做单点登录还是要基于session,就很烦

    作者回复: session是什么?会话,而JWT本身就包含了”会话信息“,相当于一个session,但这个session并不是传统意义上所指的session存储。

    2020-07-31
收起评论
25
返回
顶部