JavaWeb单点登录的实践
概念:一处登录,处处登录
比如说我们阳光沙滩有:门户前端、用户中心,以后还有其他模块。
门户:www.sunofbeach.net
用户中心:mp.sunofbeach.net
我们在account.sunofbeach.net登录以后,在这两个网站就是已经登录的了。
token
token使用MD5+JWT的形式
JWT:JSON Web Tokens
从用户密码到服务器-->使用简单的MD5加密
从服务器到数据库--->使用动态盐加密
给客户端返回的不是token,而是token的MD5值,也就是一个key
以下不是严格的时序图,可以看成流程图。


为什么要用双Token形式
为什么使用双token?
redis的特性-->noSQL,内存型数据库,存储大部分数据在内存里,快照会保存到磁盘里。
mysql关系型数据库,数据保存在磁盘上。当然,现在的mysql也有缓存的功能。
速度上来说,redis应该要更快的。
所以会配合着使用。
如果我们直接把一个长期的token保存在redis里,用户不用了,那不是很占用空间吗?所以我们会生成一个2小时的token。放在redis里,生成一个30天的refreshToken放在mysql里。
平时用户访问则取用redis里的token,如果过期了,通过refreshToken创建新的,同时也更新refreshToken。
这样子就可以减少mysql的token查询了,速度上会快一点。而且用户超过2个小时没有登录,redis里的空间就释放了。
为什么返回token的MD5而不是token
Token里有载荷,载荷里就是我们封装的信息,比如说头像,用户名,性别,手机号码,角色...个人信息,密码除外。
虽然加密了,如果给客户端,客户端使用要解密,如果解密的话就需要盐。如果把盐值给到客户端,那不就不安全了吗?比如说给到android应用,安装到一个root的系统,不就可以拿到你的信息了吗?
所以token的解析还是放到服务端。只是各服务可以解析。客户端不解析。
因此,返回token的MD5值,然后作为key,从redis里获取,解析。