单点登录和退出

发布时间:2024年01月02日

三种情况

1 多个已有系统(通过cookie,session做的登录),需要做单点登录 sso v1 v2

sso.xxx.com v1.xxx.com v2.v1.com

sso v1 v2 的token内容都是一样的,只不过是每个域名的cookie下了

$payload_test= [

'iss'=>'admin', //jwt签发者

'iat'=>time(), // jwt的签发时间

'exp'=>time()+7200, //jwt的过期时间,这个过期时间必须要大于签发时间

'nbf'=>time(), //定义在什么时间之前,该jwt都是不可用的

'sub'=>'sso.xxx.com,v1.xxx.com,v2.xxx.com', // jwt所面向的用户

'jti'=>md5(uniqid('JWT').time())//jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

'uid'=>1//用户id

];

1 用户第一次访问v1.xxx.com的页面(v1.xxx.com/user_center需要登录),系统判断未登录(通过cookie),直接跳转到登录系统sso.xxx.com,并且带着跳转url为v1.xxx.com/user_center,此时sso判断也没有登录(通过cookie判断的),则直接转到sso的登录页面。

2 在sso.xxx.com输入问用户名和密码并且确认登录成功,通过jwt生成登录token,同时把token和用户id存入redis用于模拟保持session登录。在浏览器的域名种入cookie。然后再跳转到v1,此时token也一块传过来了。

3 此时v1拿着sso传递过来的token,通过后台向sso验证是否有效,如果有效,则在v1植入自己的cookie。此时在v1登录成功

4 此时访问v2需要登录的页面,由于v2未登录,直接跳转到sso,由于sso已经登录(通过cookie里的token判断),再通过sso跳转到v2(注意此时sso是带着登录token的)

5 v2后台拿着sso传过来的token去验证是否有效,如果有效,则在v2植入cookie,此时v2也登录成功。

问题:1 v1和v2要保存的sso的token用作登录判断 2 为了方便,v1和v2的系统也可以保存一份自己的cookie信息,只是为了保存一些必要的数据

v1和v2 系统判断是否登录的依据

根据cookie里的token,通过后台post去sso系统查找是否登录(redis里查找,如果存在就是登录中)

退出

点击退出按钮,v1和v2后台通过post请求sso系统退出,此时sso系统cookie里的token删除,redis的token也删除

2 完全多个新系统做单点登录,直接用HTTP Header中的Authorization位。(解决XSS和XSRF问题) sso v1 v2

1 第一次 访问v1 需要登录的某个页面,v1请求sso接口判断是否登录(通过Header中的Authorization的token),(v1系统通过curl请求sso做验证),如果未登录则跳转到sso登录页面,记得带跳转链接callbackurl(当前访问的v1页面url)

2 在sso登录页面输入账号密码,验证通过后,jwt会生成一个token,客户端保存到本地(localStorage或sessionStorage)。服务器回在redis也保存一份,然后调回到v1之前的那个页面。则登录成功

3 接着用户去访问 v2 系统某个需要登录的页面,v2系统同样也会请求sso接口判断是否登录,如果登录,直接访问。

注意:服务器保存一份用户的登录token可以更安全的验证tokne的有效性,比如:可以判断用户是否退出,改密码立即生效,同时只能一个人登录,(token加入客户ip,登录设备信息能提示用户重新登录)等

3 app接口做token验证

sign的作用是防止参数被篡改,客户端调用服务端时需要传递sign参数,服务器响应客户端时也可以返回一个sign用于客户度校验返回的值是否被非法篡改了。客户端传的sign和服务器端响应的sign算法可能会不同。

三个参数

access-token

timestamp

sign

1 access-token 访问token

判断访问token是否正确

2 timestamp

每个请求接口都带一个timestamp参数,请求接口的有效时间,一般3分钟, 如果超过3分钟,我们就认为是非法请求。

3 sign md5(url+access-token+timestamp+imei+type+秘钥)

如果用户修改了参数,服务器算出来的sign就和传过来的sign不一致,就认为是非法请求

4 sign 放入redis,失效时间为3分钟,判断数据库里是否有sign,如果存在就是非法请求

文章接口

数据放到mongo,根据id获取内容

文章来源:https://blog.csdn.net/nihao123456789222/article/details/135333764
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。