三种情况
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获取内容