web SSO单点登录小记
什么要单点登录
很多时候我们的项目是很大的,是由几个分别独立的小项目构成的,他们或许是通域名,有的或许是不同的域名。
但是往往用户群体就是一群,他们需要使用我们不同系统的很多服务,比如阿里云系统,繁多的模块基本上每个人品都有独立域名。一旦登陆的账号服务为,从此就是一票全通了,本码农此前没有任何经验,看了一些文章页也似懂非懂的,最近觉的有点想通了,所以先记下来后面要时间。
基本思路
单点登陆需要一个统一的用户中心,阿里云为例。
https://account.aliyun.com/login/login.htm?oauth_callback 需要这样的 一个用户认证中心。
只要在这个认证中心登陆,就会获得一一张一卡通,随便逛阿里云的其他服务我房间,系统就显示你已经登陆。
写到一半各种任务都来了,自己的思路基本上打断了,好在请求群友的时候,群友推荐一篇深度好闻这里附上链接
https://www.cnblogs.com/ywlaker/p/6113927.html#!comments
自己的理解
登陆
翻评论是发现一条比较精辟评论但是没人理睬
https://www.cnblogs.com/ywlaker/p/6113927.html#!comments
但却让我眼前一亮。
当我们访问 A B C SSO这些站点时候,任何一个子站点 A B C在非本站登陆的情况下,统一跳到 SSO服务器去输入密码,登陆成功之后,跳回 A B C站中的登陆页面,没错这是一个自动登陆的页面。 该页面内联 SSO站的动态JS脚本,当然 iframe也是可以的,此时我们会获得SSO站的用户登陆信息,这份信息是非常真实的用户登陆信息,拿到这份信息,直接请求A站点的后端登陆接口设置好session,此时自动登陆完成。 这一过程中并没有文章提到的一些token,个人认为基本可以忽略了,就用默认的过期时间就好了。 那么A站登陆成功之后,B站自动登陆同样一个历程,先跳SSO,SSO等状态下,跳回B站的自动登陆页面时间自动登陆。
js iframe 有一点是可以被伪造,用户可以通过就该本机hosts 解析SSO的域名为本地,然后输出一段可以通过的脚本,此时A系统在客户端并没有成功拦截回SSO服务器,这时候,A系统拿着伪造信息去验证是通不过的,不过用户拿到另一浏览器得到的真实的用户票据(token)给SSO服务器做验证,SSO服务器拿到这个票据,验证成功之后返回给A系统附带解密出来的客户端信息,A系统得到这个客户端标志,与A系统的客户端对比,如果发现不是同一个,那么则登陆失败。
另外一种情况防止 token 被截获或者被发走记录,或者用户直接在A B C 的子应用页面直接键入链接去登陆,
此时我们子应用服务端首先要检查 reffer 如果没有那就直接跳到SSO服务区登陆。如果 reffer被伪造了,那我需要我设置验证 token的有效期,如果这个token在5秒内没有完成子应用的登陆他就失效了,同样跳回SSO服务,这一点应可以做到安全了。
单点注销
同样会面对单点注销问题,ABC 任何一个站发起注销,都是去跳转SSO站统一注销页面。
当 SSO网站完成注销之后,SSO站隐藏式请求 所有子站点 注销或者注销api记住一定是由客户端来注销。可以使用内联JS方式,iframe 方式,以及图片链接方式均可。然后跳回SSO的 登陆页面。此时我们在访问同一浏览器下面 ABC 站点就均为注销状态了。
当然还有一些关于 不同的超时时间问题,个人觉得问题不大,可以把sso的session时间加上一点。
另外这里有一个问题呢就是 如何SSO服务器过期时间已经到了,其他子站点还保持这登陆 状态这到是一个问题。为了避免这个问题,我们可以在任意子站点设置个定时请求脚本,来检测这个超时状态,一点发下超时,脚本自动跳转至 SSO 退出页面,完成所有子站点的退出。
补充关键点
A B C 站点
欢迎大家在评论区讨论。