【JWT学习之⼆】JWT实现单点登录
环境
登录页面背景图  apache-tomcat-8.5.45
  jdk1.8.0_65
  java-jwt3.3.0
  SpringBoot-2.1.3.RELEASE
⼀、需求背景
⼀个认证中⼼SSO:sso.cac2020
两个Java Web应⽤:
app1:app1.cac2020
app2:app2.cac2020
以上三个系统使⽤jwt实现单点登录。
⼆、架构设计图
使⽤Spring boot搭建⽰例⼯程:
参考:
三、JWT单点登录⽅案
1、⽅案
前端⽅案:不同域应⽤每次请求从localStorage⾥获取token作为url参数,然后应⽤使⽤校验token,然后向sso应⽤发起校验请求;(在浏览器中跨域将获取不到localstorage 中的JWT令牌,例如www.a域下的JWT,在www.b域下是获取不到的,可以使⽤iframe+H5的postMessage实现跨域共享JWT,具体参考:
后端⽅案:为⼀个唯⼀⽤户⽣成JWT,每个JWT⽣成⼀个随机的秘钥secret,将 jwt–secret 保存到redis中,想要让某个jwt失效,只需将该记录在 redis 中删除即可(这样在解密时便⽆法获取到 secret)。但是这样让⽆状态的认证机制变成有状态了(记录了 jwt 和 secret 的对应关系)
2、流程图:
⾸次访问app1流程:
app1:index.html-->app1:LoginFilter.java-->sso:checkJwt-->未登录app1:index.html-->sso:index.html-->sso:login.html-->sso:login-->app1:redirect.html-->app1:index.html 已登录app1再次访问app1:
app1:index.html-->app1:LoginFilter.java-->sso:checkJwt-->app1:index.html
已登录app1然后访问app2:
app2:index.html-->app2:LoginFilter.java-->sso:checkJwt-->app2:index.html
注销app1:
app1:index.html-->app1:LoginFilter.java-->app1:logout-->sso:inValid
3、验证
参考⽂章:
⽅案⼀:
代码参考:
⽅案⼆:
⽅案特点:
(1)依赖JWT包⽣成⼯具类JWTHelper⼯具包;
(2)采⽤iframe+H5的postMessage解决页⾯跨域问题;
⽅案三
本⽅案特点:
(1)使⽤cookie存储JWT,存在跨域问题;
(2)sso在⾸次⽣成JWT时将User相关信息存储到JWT⾥,应⽤侧获取到JWT解密JWT字符串获取User信息;
(3)sso和应⽤端使⽤同⼀个加密key,SSO侧使⽤加密key进⾏加密,应⽤端使⽤加密key进⾏紧密获取⽤户信息,如果泄露加密key就会产⽣安全问题。⽅案四
参考代码:
⽅案特点:
⽅案特点:
(1)采⽤cookie存储JWT,页⾯跨域部分使⽤的是ajax的jsonp⽅式;
(2)将不同的域存到表⾥,然后⾸次登录成功之后,在页⾯循环调⽤各个域种下cookie,⾸次登录会慢⼀下

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。