写在前面
最近小枫在工作时遇到一个问题,经过几天的思索和探究终于找到了问题所在,觉得有点价值便写了这篇文章记录下来,分享给热爱学习、乐于思考的各位,希望每个遇到相同情况的人可以通过阅读这篇文章得到解答。
话不多说,开始吧!
问题
小枫最近在开发一个平台,这里统称为A平台;A平台由两个部分构成:
- 前端部分
- 后端部分
可以看出,这是前后端分离开发的模式,前端和后端的正式环境都为:http://bin.ruofee.cn(题外话:SN战队很棒了,希望明年再度捧起LPL的荣光)。PS:本篇文章中的域名都是虚构的,如有雷同,纯属巧合。(-.-)
因为公司还有许多平台,考虑到用户信息的安全性,需要登录平台统一进行登录状态管理,因此也有个统一登录平台: http://login.ruofee.cn,这里统称为Login平台。
平台的登录流程如下:
- 浏览器打开A平台,首先进行用户状态判断:判断是否存在auth_token(auth_token是Login平台设置到浏览器中的cookie,用于登录状态保持),如果auth_token不存在则表示A平台未进行登录操作(当然也有可能进行过登录操作,但cookie已经过期),通知浏览器跳转到Login平台进行账号密码登录,如(4);如果auth_token存在则表示A平台已经进行过登录操作,进行下一步操作;
- A平台后端接口根据业务提供了一个接口:http://bin.ruofee.cn/api/validate,用于验证auth_token是否有效,如果有效则返回用户的个人信息,如果无效则通知浏览器跳转Login平台重新登录,如(3)。/validate接口的逻辑很简单,直接访问Login平台提供的验证接口(http://login.ruofee.cn/auth)进行auth_token验证。
- 浏览器不存在auth_token或者auth_token失效时都会跳转到Login平台进行账号密码登录,登录成功时Login平台会将新的auth_token设置为cookie,保存在浏览器中,用于保持当前的登录状态;
以上就是平台登录的大致流程,可以看出,平台如果想接入统一登录服务,关键的点在于A平台前端在访问A平台后端时,是否可以自动带上Login平台设置的cookie(auth_token),从而进行后面的auth_token校验流程。
那么来进行简单的分析:
Login平台在登录成功时,浏览器通过Response Headers中的Set-Cookie进行cookie设置:
# Login平台登录成功时设置cookie
Set-Cookie: auth_token=xxx; domain=ruofee.cn; path=/;
从Set-Cookie的结构可以看出:
- auth_token的domain为http://ruofee.cn,而不是login.ruofee.cn;
- path为/; </