一直想要搞明白OpenID Connect是神马,它在解决一个神马问题,看了很多文章视频还是有点糊涂。所以想换个思路,看看它和OAuth的差异到底是什么,从这点上帮助理解一下。
首先明确的一点是OpenID是在OAuth基础上的一个扩展,扩展出了一个ID Token。这个ID Token就是核心哟!
- OAuth 2.0 is a specification as to how to issue access tokens
- OpenID Connect is a specification as to how to issue ID tokens.
在之前的文章中描述了access token,它是第三方应用来获取资源所有者存储在资源服务器上数据的凭证。我们现在回顾一下access token:
access token
RFC 6749 includes the definition of a Web API called “authorization endpoint”. The API requires response_type as a mandatory request parameter.
OAuth 中有一个授权服务器,有一个endpoint来进行授权的,例如Github的https://github.com/login/oauth/authorize
。完整url如下:
https://github.com/login/oauth/authorize?client_id=f252166dc176d078abac&redirect_uri=https%3A%2F%2Fruby-china.org%2Faccount%2Fauth%2Fgithub%2Fcallback&response_type=code&state=b7b6fca650d3e86594981cc8c792efebe6af13caaee4ce4d
这个url里包含了4个参数:
client_id=f252166dc176d078abac
redirect_uri=https://ruby-china.org/account/auth/github/callback
response_type=code
state=b7b6fca650d3e86594981cc8c792efebe6af13caaee4ce4d
其中response_type
是必须的,它指明了在这个OAuth流程中所使用的模式,code
指的是授权码模式。在RFC 6749中定义的response_type
是code
或token
。
id token
OpenID在此基础上为response_type
扩展了一个id_token
,也允许这三种类型的混合。
- code
- token
- id_token
- id_token token
- code id_token
- code token
- code id_token token
- none
如果要使用response_type=id_token
,那么在https://github.com/login/oauth/authorize
的scope参数中需要添加openid
。这里只是打一个比方,目前Github并不支持OpenID,authorize可接受的参数可查看官方文档:Github Authorizing OAuth Apps。
id token的获取流程
相比于OAuth的流程,OpenID有什么不同呢?
openid.png
在这张流程图中可以看到,流程上并无明显差异,只是从AS(OAuth中的授权服务器)多返回了一个id_token。这个id_token只是一个id性质的字符串么?通过这篇文章Understanding ID Token可以得知,它就是一个JWT。并且在之后的请求中都会带着这个id token,被访问的服务器也会校验这个id token的合法性。那么这个id token存在的意义是什么呢?
摘自InfoQ的一段话:
OpenID 是一种身份识别系统,它允许用户用单个帐号登录多个网站。OpenID 是由 OpenID 基金会支持的,该组织成立于 2008 年,并得到了 Facebook、谷歌、IBM、微软、PayPal 和雅虎等多家公司的赞助。OpenID 一直被认为是一种可以免除人们“为每一个网站创建帐户并记忆用户名 / 密码”的身份验证方案。
-
场景一:
想想上篇文章提到的第三方登录,如果Github是它的唯一登录方式,是它唯一的Identity Provider。那么也就是说RubyChina不需要创建自己的SessionId或是Token这种东西,直接在登录成功后将id token返回给浏览器,有了这个id token,就可以保持当前回话,访问RubyChina的其他资源,这也就达到它起初的愿景咯。 -
场景二:
单点登录SSO,在火热的微服务架构下,需要自建一个Identity Provider。用户通过这个server获得一个JWT的token(id token)就可以访问scope内的任意服务。
通过这两个场景就已经很好的解释了OpenID解决的问题。它是一套完善的认证授权机制,通过它可以很好的解决开发过程中的访问控制问题。
在下一篇文章里,会来聊聊对id token的理解。
网友评论