【laravel】单点登出

单点登出

我使用的是SSO服务器向各个子系统发起登出请求来实现单点登出。

如SSO发起 a.com/logout 请求

问题: session_id 怎么获取?

让SSO调用A服务器的logout登出,需要让A服务器知道要登出哪个用户的会话,就需要知道session_id

解决: 在A系统验证 ST 的时候,把自身的session_id一并发送给SSO,SSO验证成功后,生成一个TGT,一个TGC,然后把 TGT, TGC,session_id 一起存入数据库。这样当下次用户登出时,可通过TGC查到对应的会话id

问题: session_id 是会过期的,比如Laravel 的session默认为2小时,2小时后会重新生成,那这样SSO数据库中的TGC就没用了

解决:

  1. A系统在获取到ST的返回结果后,拿到了TGC,A系统把TGC同时存储在cookie和session中。
  2. 后面每次请求都判断两者是否相等,不等则携带此时的session_id向SSO进行验证。
    1. 如果TGC没过期,就证明是A系统的session更新了,SSO把A系统顺便发来的session_id更新到数据库
    2. 如果TGC过期了,那么就返回false,让A系统把cookie的TGC删掉

...

这种方式的单点登出的开销

  1. SSO需要新增一张表,维系TGT,TGC,session_id的关系
  2. 子系统需要实现两个方法,一个是前置判断是否登录的中间件,一个是用于登出的logout方法

其他的

单点登出可能会有些登出失败,比如有5个服务登录了,2个登出失败了,这种情况暂时没想到什么好办法,只能是重复再发起请求尝试,实在不行返回错误信息给前端,让用户手动去这些网站挨个登出。或者在做子系统权限验证的时候,加入一个逻辑,第一次打开浏览器第一次访问时向服务器做一次验证,这样就可以通知让用户关闭浏览器来实现登出。因为下一次打开浏览器会做一次验证。其他的一些敏感操作,比如查看手机号码,地址,删除信息,等,就需要做二次验证,确保该用户有登录

posted @ 2021-04-20 21:48  蜜蜂老牛黄瓜  阅读(153)  评论(0编辑  收藏  举报