对OpenID Connect的理解

2019-10-20  本文已影响0人  西西的一天

一直想要搞明白OpenID Connect是神马,它在解决一个神马问题,看了很多文章视频还是有点糊涂。所以想换个思路,看看它和OAuth的差异到底是什么,从这点上帮助理解一下。

首先明确的一点是OpenID是在OAuth基础上的一个扩展,扩展出了一个ID Token。这个ID Token就是核心哟!

  1. OAuth 2.0 is a specification as to how to issue access tokens
  2. 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_typecodetoken

id token

OpenID在此基础上为response_type扩展了一个id_token,也允许这三种类型的混合。

  1. code
  2. token
  3. id_token
  4. id_token token
  5. code id_token
  6. code token
  7. code id_token token
  8. 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 一直被认为是一种可以免除人们“为每一个网站创建帐户并记忆用户名 / 密码”的身份验证方案。

  1. 场景一:
    想想上篇文章提到的第三方登录,如果Github是它的唯一登录方式,是它唯一的Identity Provider。那么也就是说RubyChina不需要创建自己的SessionId或是Token这种东西,直接在登录成功后将id token返回给浏览器,有了这个id token,就可以保持当前回话,访问RubyChina的其他资源,这也就达到它起初的愿景咯。

  2. 场景二:
    单点登录SSO,在火热的微服务架构下,需要自建一个Identity Provider。用户通过这个server获得一个JWT的token(id token)就可以访问scope内的任意服务。

通过这两个场景就已经很好的解释了OpenID解决的问题。它是一套完善的认证授权机制,通过它可以很好的解决开发过程中的访问控制问题。

在下一篇文章里,会来聊聊对id token的理解。

上一篇下一篇

猜你喜欢

热点阅读