一种跨域单点登录的解决办法

现有多个应用,要求这几个应用统一通过一个网站(假设该网站的域名是login.com)登陆,若一个浏览器上成功登陆后,在同个浏览器下打开其他应用无需再次登陆,也就是一个浏览器只需登陆一次。

首先想到的是用cookie实现单点登陆:登陆成功后,login.com的服务器生成一个唯一的log id并保存到一个表中,并向浏览器cookie中写入该id,当其他应用接收到请求时,先检查有无log id,若有则与login.com的登陆表中对照进行验证,若无则重定向到登陆网站。

但这种方式有一个跨域的问题。如果统一登陆的几个应用在和login.com在同一域名下,则可以获取cookie,如果分别在不同域名下,则无法获取到login.com的cookie.这样其他应用无法获取到login.com的cookie,其他应用的后台也就无法判断浏览器的登陆状态。

因此,login.com的登陆采用ajax方式(或者iframe)无刷新登陆,在login.com登陆成功后,在登陆表中写入log id,同时写入一个过期时间戳。之后向浏览器发回响应,写入log id,然后浏览器再次向其他每一个应用的登陆action发送请求,请求参数就是log id。其他应用的action收到该请求后,先在login.com的表中验证,若验证成功则在session中保存log id,并设置response,将log id写入浏览器的cookie。这样所有其他应用对应同个浏览器的session和cookie中都保存了log id

其他应用每次在判断客户端登陆状态时,先根据session中是否有log id进行判断,可以减轻login.com的负担;若session中没有log id,则有可能客户端未登录,也有可能是某一个应用处于活跃状态,而其他应用的session由于过期而弃用,因此为保证同一浏览器上所有应用的登陆状态同步(即只要其中一个应用保持登陆状态,其他应用也保持登陆状态),再与login.com通信,判断接收到的客户端cookie中的log id是否与login.com的登陆表中的log id一致,如果一致则重新写入session,若不一致则重定向至登陆页面。而login.com中设置一个定时任务,每隔一段时间就判断时间戳是否过期,若过期则删除。

这样还有一个问题,就是其他应用判断登陆状态时,是先根据自己的session判断,而没有与login.com进行交互,这样就可能导致当客户端在其他应用保持长时间的活跃状态时,login.com中保存的时间戳一直未更新,使得定时任务判断时间戳到期而删除。因此在向其他应用发送log id时,也一起发送时间戳,其他应用的seesion中同时保存log id和时间戳,cookie中只保存log id。应用在判断客户端登陆状态时,先检查session中是否保存了log id和时间戳,若保存,则登陆成功,再判断时间戳是否将要过期(假设离过期时间10分钟以内为将要过期),若将要过期则向login.com发送请求,更新时间戳;若尚未到10分钟以内,则不与login.com通信。

如果这样做的话,还需要设置log id的过期时间比应用的session过期时间要长,否则可能出现session中有log id,但是时间戳已过期,login.com的登录表中已删除该log id.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值