美文网首页杂谈服务端
web SSO单点登录小记

web SSO单点登录小记

作者: 北方蜘蛛 | 来源:发表于2019-03-14 20:24 被阅读4次

    什么要单点登录

    很多时候我们的项目是很大的,是由几个分别独立的小项目构成的,他们或许是通域名,有的或许是不同的域名。
    但是往往用户群体就是一群,他们需要使用我们不同系统的很多服务,比如阿里云系统,繁多的模块基本上每个人品都有独立域名。一旦登陆的账号服务为,从此就是一票全通了,本码农此前没有任何经验,看了一些文章页也似懂非懂的,最近觉的有点想通了,所以先记下来后面要时间。

    基本思路

    单点登陆需要一个统一的用户中心,阿里云为例。
    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

    image.png

    但却让我眼前一亮。

    当我们访问 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 站点就均为注销状态了。

    image.png

    当然还有一些关于 不同的超时时间问题,个人觉得问题不大,可以把sso的session时间加上一点。

    另外这里有一个问题呢就是 如何SSO服务器过期时间已经到了,其他子站点还保持这登陆 状态这到是一个问题。为了避免这个问题,我们可以在任意子站点设置个定时请求脚本,来检测这个超时状态,一点发下超时,脚本自动跳转至 SSO 退出页面,完成所有子站点的退出。

    补充关键点

    A B C 站点

    欢迎大家在评论区讨论。

    相关文章

      网友评论

        本文标题:web SSO单点登录小记

        本文链接:https://www.haomeiwen.com/subject/jsmqmqtx.html