09 | 实战:利用OAuth 2.0实现一个OpenID Connect用户身份认证协议
OIDC 是什么?
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了如何利用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-18718 - 工资不交税在应用oss中,一端退出是不是还需要通知认证服务?不然认证服务的状态还是登录,那其他端还是能直接登录,甚至自己都没法退出。
作者回复: 要通知
2020-07-21811 - DB聪图3中”重复上述1-6”陈述单点登录的描述感觉有点难理解,原因在第3步,如果分别登陆a1.com、a2.com、a3.com的时候,都有第3步的参与,那是否意味着End User每次都需要输入用户名和密码呢?
作者回复: 重复1-6的本意是要表达都需要进行1-6步骤,在图中我们分了已登录和未登录两种情况,那个步骤3是在未登录的情况下发生的。
2020-07-1898 - 成立-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-0647 - leros能不能比较下基于SAML和基于OIDC的SSO?一些大的授权服务平台可能二者都提供,不太清楚具体实践中如何选择
作者回复: 像Kerberos、SAML这些的特点就是复杂,至少相对于OAuth 2.0 要复杂的多,现在基于OAuth 2.0的OIDC是趋势。
2020-07-196 - 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-1624 - 哈德韦传统的登录基于Session,是不是使用JWT Token方案,就不需要Session了(也不需要Cookie参与了)?
作者回复: 是的
2020-07-1944 - 往事随风,顺其自然代码中access_token中就包含用户信息,获取accesstoken 时候需要带上id_token中的用户唯一标识?
作者回复: 无论普通的access_token还是JWT格式的access_token,归根结底还是【访问令牌】,访问令牌永远对第三方软件不透明,JWT格式的access_token包含用户信息,也是在当第三方软件请求到受保护资源的时候,受保护资源去解析识别。 id_token是我们说的OIDC这样的协议在OAuth 2.0的基础上增加的一个可以包含用户ID属性的事物。
2020-07-1853 - 哈德韦前面的课程里讲到,一般来说 JWT 有个缺陷,为了克服“覆水难收”,需要一个额外的用户粒度的密钥管理。那么,这个用户粒度的密钥管理是针对 access_token 的吗?id_token 的密钥,也需要到用户粒度吗?
作者回复: 是的,在04中我们指的是access_token,那个时候还没有接触和提到ID_TOKEN。 id_token 的密钥的粒度,这个要结合我们自己对安全要求的级别来对待,粒度一般是有这样几种,到第三方软件应用级别粒度,到第三方软件应用的用户级别粒度。实际上id_token的安全要求是要比access_token的低。
2020-07-192 - 在路上王老师,单点登录的步骤中,a2.com需要去解析,id_token的 ID值么?
作者回复: 需要的,a2.com要识别用户标识,需要解析id_token的值。
2020-07-211