JWT入门
Posted 丶落幕
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JWT入门相关的知识,希望对你有一定的参考价值。
JWT入门
前言
JWT是什么
json web token
JWT能做什么
- 授权
- 认证
JWT结构
- 标头(Header)
通常由两部分组成:令牌类型和签名算法- 有效载荷(Payload)
声明有关实体类(通常是用户)和其他数据声明- 签名(Signature)
使用编码后的Header和Payload以及我们提供的一个密匙,然后使用header中指定的签名算法进行签名
Header和Payload不管哪一个被改动,都会导致Signature不一致
因此JWT通常如下所示:xxxx.yyyy.zzzz Header.Payload.Signature
使用步骤
1.编写测试demo
代码如下(示例):
@Test
void contextLoads() {
Map<String, Object> map = new HashMap<>();
Calendar instance = Calendar.getInstance();
instance.add(Calendar.MINUTE,30);
String token = JWT.create()
.withHeader(map)//header
.withClaim("userId", 21)//payload
.withClaim("username", "chen")
.withExpiresAt(instance.getTime())//设置过期时间
.sign(Algorithm.HMAC256("chen"));//签名,参数为签名算法,常用的就是hmac256
System.out.println(token);
}
@Test
void test(){
//创建验证对象
JWTVerifier verifier = JWT.require(Algorithm.HMAC256("chen")).build();
DecodedJWT verify = verifier.verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MjI3MjAxODgsInVzZXJJZCI6MjEsInVzZXJuYW1lIjoiY2hlbiJ9.RPOrLT9lov5jBw5TJFfG3_zksEbSeTXUwfgn8bywH4o");
System.out.println(verify.getClaim("userId").asInt());//不as也能取出来
System.out.println(verify.getClaim("username").asString());
System.out.println(verify.getExpiresAt());//剩余时间
}
2.封装通用模板
代码如下(示例):
private static final String SING = "~!@#$%^&";
//生成token
public static String getToken(Map<String,String> map){
Calendar instance = Calendar.getInstance();
instance.add(Calendar.DATE,7);//默认7天过期
JWTCreator.Builder builder = JWT.create();
//payload
map.forEach((k,v)->{
builder.withClaim(k, v);
});
//设置过期时间 and 加密
return builder.withExpiresAt(instance.getTime()).sign(Algorithm.HMAC256(SING));
}
//验证token
public static DecodedJWT verify(String token){
return JWT.require(Algorithm.HMAC256(SING)).build().verify(token);
}
总结
单体项目可以在拦截器中验证token
分布式可以在网关中进行校验
以上是关于JWT入门的主要内容,如果未能解决你的问题,请参考以下文章