JWT
什么是JWT
json web token令牌
JWT能做什么
为什么是JWT
基于传统的session认证
认证方式
认证流程
暴露问题
基于JWT认证
认证流程
注意问题
JWT的结构
令牌组成
Header
Payload
Signature
组成
使用JWT
引入依赖
生成token
根据令牌和签名解析数据
JWT工具类封装
public class JwtUtils {
private static final String SIGN="fjs#%^*jfskl";
/**
* 生成jwtToken header.payload.sign
* @param map
* @return
*/
public static String creatJwtToken(Map<String,String> map){
Calendar calendar=Calendar.getInstance();
calendar.add(Calendar.DATE,7);//默认7天过期
//创建jwt builder
JWTCreator.Builder builder = JWT.create();
//payload
map.forEach((k,v)->{
builder.withClaim(k,v);
});
String jwtToken = builder.withExpiresAt(calendar.getTime()) //过期时间
.sign(Algorithm.HMAC256(SIGN)); //sign
return jwtToken;
}
/**
* 验证token
* @param token
*/
public static void verifyToken(String token){
JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
}
/**
* 获取token信息
* @param token
* @return
*/
public static DecodedJWT getTokenInfo(String token){
DecodedJWT verify = JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
return verify;
}
}
整合springboot
思路
前端携带用户名密码来认证,认证通过返回token,后续用户请求其他接口带token来验证,验证通过可以访问其他接口,否则不能访问
@Mpper注解相当于启动类上的@MapperScanner注解
登录生成token
前端访问时令牌验证
存在的问题
拦截器优化
token 建议放在请求头里,所以要从请求头里获取
拦截器实现
拦截器配置
业务处理
JWT基于客户端的管理,只要客户端的不过期,就一直可用
单点登录
不同的域名代表不同的站点,域名不一样,部署的服务器(tomcat)不一样
三方登录
session跨域
什么是域
跨域
session跨域定义
单点登录实现机制
用JwtToken机制来实现单点登录和解决跨域问题。
单点登录踢人
实现单个账号只允许在一处登录的功能,也就是说在登录状态未失效的情况下,下一次登录必须踢掉上一次的登录。如果我们不做限制的话,单个账号多次登录就会产生多个token,只要未过期就都能调用接口。
使用redis
我们可以将用户每次登录后产生的token 存入redis 中,key中加入用户id来识别
//token 存入redis
redisTemplate.opsForValue().set("access_token:member_"+member.getId(), token, 30, TimeUnit.DAYS);
那么第二次同一账号执行登录操作的时候就会覆盖上一次登录存在redis中的token。