一)微服务下的登录验证JWT的使用
1)JWT(JSON WEN TOKEN)
微服务下登录检验解决方案 JWT讲解
简介:微服务下登录检验解决方案 JWT讲解 json wen token
1、JWT 是一个开放标准,它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法。
JWT 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名
简单来说,就是通过一定规范来生成token,然后可以通过解密算法逆向解密token,这样就可以获取用户信息
使用JWT进行用户校验的方式是将用户的信息存储在客户端上,用户在登录的时后在数据库内查询到的信息,会根据一定的格式将的数信息进行加密,然后返回给客户端进行存储,当用于在其他的节点上登录的时候服务端只需要将信息进行解密如果存在即可判断用户已经登录过了。
数据模型:
{
id:888,
name:'小C',
expire:10000
}
funtion 加密(object, appsecret){
xxxx
return base64( token);
}
function 解密(token ,appsecret){
xxxx
//成功返回true,失败返回false
}
优点:
1)生产的token可以包含基本信息,比如id、用户昵称、头像等信息,避免再次查库
2)存储在客户端,不占用服务端的内存资源
缺点:
token是经过base64编码,所以可以解码,因此token加密前的对象不应该包含敏感信息
如用户权限,密码等
2、JWT格式组成 头部、负载、签名
header+payload+signature
header 头部:主要是描述签名算法
payload 负载:主要描述是加密对象的信息,如用户的id等,也可以加些规范里面的东西,如iss签发者,exp 过期时间,sub 面向的用户
signature 签名:主要是把前面两部分进行加密,防止别人拿到token进行base解密后篡改token
3、关于jwt客户端存储
可以存储在cookie,localstorage和sessionStorage里面
cookie:这个就不用说了
localstorage:这个是浏览器的本地存储
sessionStorage:存储在浏览器的会话中
二)JWT实例演示
1).加入依赖
!-- JWT相关 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
2)构件加密方法
/**
* 主题
*/
private static final String SUBJECT="xiaoxiao";
/**
* 失效时间
*/
private static final long LOSETIME = 1000*60*60*24*7;
/**
* 加密的秘钥使用UUID128位随机加+base64加密
*/
private static final String KEY = "YzJkYjNlNjc5NGNlYmI1Y2NiNmMxNTQxODcxNDk3OHE3d2Vhc2Rhd3E=";
/**
* 用户登录加密
* @param user user
* @return
*/
public static String encryption(User user){
//构件加密对象
String token = Jwts.builder().setSubject(SUBJECT)
.claim("id", user.getId())
.claim("name",user.getName())
.claim("img", user.getHeadImg())
//设置签发的时间
.setIssuedAt(new Date())
//设置失效时间
.setExpiration(new Date(System.currentTimeMillis() + LOSETIME))
//设置加密的秘钥
.signWith(SignatureAlgorithm.HS256, KEY)
//对生成的秘钥token进行压缩
.compact();
return token;
}
加密后生成的字符串
3)解密
**
* 用户解码 注意要加try catch 块 如果匹配错误的话是会出现异常的。
* @param token user token
* @return
*/
public static Claims decode(String token){
try
{
Claims claims = Jwts.parser().
setSigningKey(KEY).
parseClaimsJws(token).getBody();
return claims;
} catch (ExpiredJwtException e)
{
e.printStackTrace();
} catch (Exception e)
{
e.printStackTrace();
}
return null;
}
这样我们可以在拦截器内进行数据的拦截进行判断是否登陆