cookie实现单点登录的具体方案
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
前言
网上搜单点登录
的文章有很多实现方案有cookie、session、jwt等但大多讲的都是原理核心问题都没提到因此这里我根据以下2个条件整理一个可行方案
- 只考虑同域不跨域
如a.my.com、b.my.com等都在*.my.com主域内因此使用cookie比较方便 - 前后端分离
目前大多前端项目都基于react、vue因此必须要考虑
问题
看了不少文章有个问题一直没找到方案使用cookie时前端如何判断是否登录因此我按自己的理解想了两个方法
- 方法一HttpOnly设为false
后端设置cookie时将HttpOnly设为false这样前端js就能读取cookie判断是否存在登录信息但是安全性会降低 - 方法二使用nginx判断
nginx代理判断header里是否有指定cookie没有则跳转sso登录页
场景如下
- A网站
a.my.com
- B网站
b.my.com
- SSO网站
sso.my.com
- 存储用户已登陆cookie的值为
tk=xxx
xxx为后端加密后的用户id和过期时间
实现逻辑
A网站
- 浏览器打开
a.my.com/index.html
- 前端判断是否登录
- 方法一HttpOnly设为false
- js判断浏览器cookie是否存在
tk
有就继续打开网页否则跳转sso.my.com/login.html?return=a.my.com/index.html
- js判断浏览器cookie是否存在
- 方法二nginx判断
- nginx代理请求头cookie是否存在
tk
存在返回静态文件否则跳转sso.my.com/login.html?return=a.my.com/index.html
- nginx代理请求头cookie是否存在
- 方法一HttpOnly设为false
- 输入账号密码点击登录post请求给
sso.my.com/api/login
- sso服务端验证信息成功则返回200状态码并设置cookietk=xxx域名设为
.my.com
方法一中在此处设置HttpOnly为false - 前端判断状态码为200获取url中return值的A网站链接
a.my.com/index.html
并跳转过去 - A网站每次请求api时A后台获取请求cookie里的
tk
没有则返回401 - 若存在
tk
则用sso服务中的加解密方法进行解析可封装成sdk获取到用户id和过期时间如果过期则返回401 - 前端js判断返回状态码为401则跳转SSO登录页
sso.my.com/login.html?return=当前url
B网站
- 浏览器打开
b.my.com/index.html
- 请求时会自动带上
.my.com
域中的cookie实现登陆状态 - 其他同上