最近在对基于token作身份认证的项目中扩展sso。git
项目大体架构以下 github
身份认证是基于token,客户端登陆以后,服务器端验证并发送JWT token给客户端,客户端将token存入localStorage中并每次恢复到Vuex中,客户端每次请求都会在HTTP自定义头部中附带token。安全
本文简述下我对OIDC解决方案的简单理解以及基于上述架构实现sso的思路。服务器
OIDC的官方解释以下cookie
OpenID Connect 1.0 is a simple identity layer on top of the OAuth 2.0 protocol. It allows Clients to verify the identity of the End-User based on the authentication performed by an Authorization Server, as well as to obtain basic profile information about the End-User in an interoperable and REST-like manner.session
也就是OAuth2.0只解决了资源的访问和分享,OIDC则基于此实现了用户的认证。它的主要目的是提供一次登陆,多个站点享有登陆状态。也就是当用户在某一使用OIDC的网站登陆时,用户被重定向到OpenID站点登陆,而后重定向回原来网站。架构
OIDC已经有不少的企业在使用,好比Google的帐号认证受权体系,Microsoft的帐号体系也部署了OIDC,固然这些企业有的也是OIDC背后的推进者。并发
OAuth2提供了Access Token来解决受权第三方客户端访问受保护资源的问题;类似的,OIDC在这个基础上提供了ID Token来解决第三方客户端标识用户身份认证的问题。OIDC的核心在于在OAuth2的受权流程中,一并提供用户的身份认证信息(ID-Token)给到第三方客户端,ID-Token使用JWT格式来包装,得益于JWT(JSON Web Token)的自包含性,紧凑性以及防篡改机制,使得ID-Token能够安全的传递给第三方客户端程序而且容易被验证。应用服务器,在验证ID-Token正确以后,使用Access-Token向接口换取用户的更多的信息。ide
第一期先从简,也不讨论什么OIDC协议族,就单单说一下OIDC是怎么运做的。以仍是以午安网举例。网站
若是我要使用大午安帐号登入午安空间网站,那么这个大体流程以下:
设计可能比较粗糙或者有问题,若是有问题但愿评论一下帮我修正修正。 设计使用的是Implicit Flow。
没啥好说的,客户端清理本身的状态,而后发出登出请求给oidc-server。
这块就找到了一个网上的例子
其利用oipc协议族里的Discovery服务中提供的一个check_session_iframe接口。
核心原理是让客户端插入一个oidc-server页面的iframe并周期性的检查,当我在“午安空间”点击登出的时候,会发出登出请求给oidc-server并触发oidc-server的站点清理本身的cookie,而后在以前客户端中使用check_session_iframe这个隐藏的iframe能够检测到这种变化,从而使得客户端能够得知用户已在再其余的应用的客户端退出登陆,这时候就清理本身客户端的登陆状态。
例子中的客户端代码
这部分放的是下版本要加的或者完善的。
了解下Authorization Code Flow。
若是只有上面的解决方案的话会存在一个问题,那就是若是我sso已登陆,我到另外一个网站好比午安影视,我须要点击登入以后才会出现登陆状态。也就是说没有自动登陆。
一个实现的方法是能够在一开始就去访问oidc-server询问是否已经登陆,oidc-server的协议族Discovery提供一个接口。