生成token
private String generateToken(Long userId) throws UnsupportedEncodingException {
String secret = "secret";
HashMap<String, Object> map = new HashMap<>();
map.put("userId", userId);
String jwt = Jwts.builder()
.setClaims(map)
.signWith(SignatureAlgorithm.HS512, secret.getBytes("UTF-8"))
.compact();
return jwt;
}
解析token
Claims getClaimsFromToken(String token) {
Claims claims;
try {
claims = Jwts.parser()
.setSigningKey(secret)
.parseClaimsJws(token)
.getBody();
} catch (Exception e) {
claims = null;
}
return claims;
}
问题 : 在退出登录 / 修改密码时怎样实现JWT Token失效?
回答 : 退出登录时, 只要客户端丢弃Token,服务器端不需要丢弃Token
问题 : 要是用户已经在多设备登录了,而且本地保存了token。当一个地方丢弃token,只有token没有过期,那之前token还是可以用
回答:数据库建一个表user_token(uid,token),用户登录成功将token存到数据库,用户登出清除token,每次对比传过来的token和该用户在数据库的token是否相同,保证一个uid只生成一个token。
问题 : 如果在服务端存储token,那随便存储个字符串也可以,不一定要用token
JWT只不过提供了一种基于token的请求验证机制,但用户权限,API权限,资源权限等限制可以用Spring Security来实现。
网友评论