单点登录问题总结

jwt是什么?

jwt是一种session信息存储方案,单点登录和是否用jwt没关系,jwt也是和系统内的流程一致,不一样的地方就是将session数据放到了前端。JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。

是否有CSRF风险?

有。

  1. 可以加Access-Control-Allow-Origin来控制可以跨域请求的页面
  2. 跳回到子系统的时候,后台可以返回token,所有请求都需要带上token验证。

优化空间

登录成功后现在是访问authority/user/redirect由后端进行302跳转到子系统redirect路由。这是因为之前到方案是需要后台写cookie到子系统,直接跳转到子系统页面上。改成了现在这样。但是依照现在的方案的话,没有必要再走一次302.直接在登录接口返回ticket,由前端带上ticket直接访问子系统的redirect路由,该路由再返回html,执行location.href=要跳往的路径。可以少一次302跳转,减少loading时长。

cookie有同源策略,为什么不同域名访问cookie对应domain时都会携带上该cookie?

对cookie同源策略理解有问题,cookie的同源策略指的是访问不同域的资源时,浏览器允不允许携带cookie,和当前页面域名没有关系。比如A域名下访问了B域名的接口,会带上B域名下的cookie,但不会带上C域名下的cookie。

为什么需要单点登录?

  1. 用户希望登录一个系统后,登录其他系统不想再登录一遍。
  2. 而且在私有化部署时,各子域需要部署各自的登录模块。前后端代码都是用的各自的,不便于维护。
  3. chromefirefox等浏览器支持第三方cookie,iesafari不支持。这就导致我们不能共用一个登录域下的cookie。

单点登录的整体流程

单点登录整体流程

子系统融合时各系统获取登录态的问题

之前公司各个子系统各自独立,公司发展,同事客户也希望购买多个产品时,应该只有一个系统而不需要私有化部署多套系统。

系统融合时,原来的计划是融合后的菜单中,子菜单中为各个子系统,子系统内的请求还是走各自的系统的接口。出现的问题是在统一的登录中心登录完成跳回到系统时(此时写cookie到系统域名下),如果请求不同菜单(也就是不同子系统中的服务),会出现请求不同域导致后台无法获取到种在当前系统下的cookie,后台也就无法判断当前用户是否登录。

业内常见的做法是登录成功后写入到主域下,各个子系统分别在各子域中,这样子域就能拿到主域的cookie,因为我们的系统是私有化部署,使用时都是ip,也就不存在主域的概念。无法使用这个办法,另外一个办法后台写cookie时,httponly设为false,由前端来获取到当前域下写入的cookie,请求不同子系统时作为参数带上。不过这样安全性就会降低。

目前的做法还是走反向代理,走统一的接口地址,由后台来转发各子系统下的请求,统一前缀来作区分。

在登录中心登录成功后如何写cookie到子系统域名下?

方案一:

  1. 前端重定向到子系统,带上登录成功后下发的ticket,子系统前端请求后台,将该ticket带上。
  2. 后台拿到该ticket后调用authority进行校验。如果成功就写登录cookie到子系统域名下。
  3. 子系统拿到请求结果再渲染对应资源。这种方式简单,但有个缺点是每个子系统接入都得重写一遍该逻辑。

方案二:

  1. 约定一个固定的子系统跳转地址,各子系统后台接入sdk 后,每个请求都会先经过该sdk,sdk监听该固定地址。
  2. 在登录中心登录成功后,前端请求authority下的一个地址,返回结果为302,并且写cookie到登录中心域名下,重定向地址为子系统下的固定地址,并带上ticket。
  3. sdk监听到该请求后,再次返回302 重定向地址到子系统真实页面,并将ticket写入到子系统cookie中。(这里不能返回302,在各浏览器中同时返回302和cookie不能写入成功,项目中的解决方案是状态码还是为200,资源返回html,由html中js来做跳转)
  4. nginx则转发到对应的机器目录下,返回对应的静态资源。

当一个子系统登录成功后,直接访问另外一个子系统,发生了什么?

首先会直接拿到前端资源并发起请求,如果请求响应为登录失效,则前端跳转页面到登录中心某一地址,【注意】这时候的请求就会带上登录中心页面的cookie,后台校验发现cookie有效,那么会返回302响应,戴上ticket跳回之前约定好的子系统固定地址,sdk监听到该请求后如果ticket有效,那么就回到方案二中的步骤3,最后跳回到子系统。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345