SSO单点登录重定向解决方案

开发 前端
当我们写好SSO单点登录服务的代码后,通过调用接口方式验证,流程看似正常,但开始与前端联调就出现问题了。

[[376527]]

当我们写好SSO单点登录服务的代码后,通过调用接口方式验证,流程看似正常,但开始与前端联调就出现问题了。

流程是这样的:前端在首页使用ajax访问后端获取菜单或者用户信息的接口,以触发登录校验,如果未登录则重定向到SSO登录页面。

但这一步就出问题了,原因是ajax无法拦截302处理。当ajax接收到302响应时,看起来就像是ajax直接向重定向链接发起请求,而不是让浏览器重定向,结果啥事也没干。

关于ajax无法拦截302处理的原因,笔者从网上找到的解释如下。

服务器将302响应发给浏览器时,浏览器并不是直接进行ajax回调处理,而是先执行302重定向,从响应头中读取Location信息,然后向Location中的Url发出请求,在收到这个请求的响应后才会进行ajax回调处理。

大致流程:ajax -> browser -> server -> 302 -> browser(redirect) -> server -> browser -> ajax callback。

原本是为了让前端以最少的改动接入SSO,但因为笔者对前端的了解较浅,才犯了这样的错误。

既然ajax无法处理302,那也只能修改流程,让前端主动发起重定向了。

流程修改后,当后端验证用户未登录或登录过期时响应401状态码,同时body给出重定向链接,而前端需要全局拦截401错误,从响应body获取链接并让浏览器重定向到指定链接,该链接就是由后端拼接好的跳转到SSO登录的链接。

最后还有一个cookie问题。由于本地测试,前端将请求转发给部署到测试环境的后端,前端的域名为127.0.0.1,后端测试环境域名为xxx. com,导致本地测试跳转到SSO登录成功并返回后,前端向后端发起请求依然响应401。

原因在上篇已经描述过了,就是因为域名不同,前端使用ajax发起请求,浏览器并不会将xxx.com域名下的cookie带上,只会带上127.0.0.1域名下的cookie。

解决该问题只需要修改传给SSO登录成功后重定向的checkToken接口的域名为前端本地测试的域名,由前端将请求转发给后端,或者在nginx配置将此接口的请求转发给后端处理,只有这样session才能保持一致。

除此之外,跨协议无法重订向。也就是说,sso部署在测试环境域名为https://sso.xx.com,而接入sso的服务在本地测试域名为http://127.0.0.1,想要从https://sso.xx.com登录成功后重定向回http://127.0.0.1是不支持的,原因是跨协议重定向了,由https协议变成了http协议。

从这些事情可以看出,实战很重要!即便理解了流程、实现原理,但不动手实战就学不到细节,无法从各种踩坑过程中成长。

 本文转载自微信公众号「Java艺术」,可以通过以下二维码关注。转载本文请联系Java艺术公众号。

 

责任编辑:武晓燕 来源: Java艺术
相关推荐

2021-10-29 13:26:54

单点登录SSO

2020-12-28 05:52:27

SSO登录单点

2019-07-24 15:12:08

单点登录SSO密码

2022-11-28 09:19:33

2023-11-08 14:57:41

2024-03-01 11:33:31

2021-09-28 10:48:07

开源双因素认证单点登录

2022-05-12 07:37:51

单点登录微服务开源

2010-12-14 15:07:15

ICMP路由重定向

2014-04-11 09:22:17

MySQL双主架构单点故障

2021-06-01 06:01:35

SSO单点登录

2023-12-11 13:05:21

2012-07-11 13:45:33

伊顿

2020-02-28 08:00:35

单点登录系统

2018-12-03 12:17:27

Semptian解决方案

2012-05-27 16:21:31

IDC华为

2018-12-03 11:59:42

Inventec解决方案

2018-12-03 12:13:21

Mellanox解决方案

2018-12-03 12:26:30

YADRO解决方案

2016-10-24 09:31:37

Windows 10远程桌面连接
点赞
收藏

51CTO技术栈公众号