15分钟学会JWT使用
15分钟学会JWT使用
什么是JWT?
JSON Web Token ,通过数字签名的方式,以JSON对象为载体,在不同的服务终端之间安全的传输信息。
jwt 可以生成 一个加密的token,做为用户登录的令牌,当用户登录成功之后,发放给客户端。
请求需要登录的资源或者接口的时候,将token携带,后端验证token是否合法。
JWT有什么用?
JWT最常见的场景就是授权认证,一旦用户登录,后续每个请求都将包含JWT,系统在每次处理用户请求之前,都要先进行JWT安全效验,通过之后再进行处理。
JWT的组成
JWT由3部分组成,用 . 拼接
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2NDk4Mzk0MDMsImp0aSI6IjRlMWEzZjc5LTA1ZTUtNGFhMy04ZDg0LTFjZmZiOTgzMjBhOCJ9.FW7Hfvigheuh1zQLL2b0gB-kw4DLE7k45N9-hAqyIEQ
jwt 有三部分组成:A.B.C
A:Header,{“type”:“JWT”,“alg”:“HS256”} 固定
B:playload,存放信息,比如,用户id,过期时间等等,可以被解密,不能存放敏感信息
C: 签证,A和B加上秘钥 加密而成,只要秘钥不丢失,可以认为是安全的。
jwt 验证,主要就是验证C部分 是否合法。
这三部分分别是;
- Header(头)
{
'type':'JwT',
'alg':'HS256'
}
- Payload(载荷)
{
"sub":'1234567890',
"name":'john',
"admin":true
}
- Signature(签名,对前两个信息的再次加密,用.拼接起来)
var encodedString = base64UrlEncode(header)+"."+base64UrlEncode(payload);
var signature = HMACSHA256(encodedString,'secret');
pom.xml
<!--jwt依赖-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<!--高于1.8版本的jdk需要加入以下依赖-->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
测试案例一
package com.jihu;
import io.jsonwebtoken.*;
import org.junit.Test;
import java.util.Date;
import java.util.UUID;
public class JwtTest {
private long time = 1000 * 60 * 60 *24; //一天的有效期
private String signature = "admin";
@Test
public void jwt(){
JwtBuilder jwtBuilder = Jwts.builder();
String jwtToken = jwtBuilder
//header
.setHeaderParam("type","JWT")
.setHeaderParam("alg","HS256")
//payload
.claim("username","tom")
.claim("role","admin")
.setSubject("admin-test") //自己定义的
.setExpiration(new Date(System.currentTimeMillis()+time)) //设置过期时间
.setId(UUID.randomUUID().toString())
//signature
.signWith(SignatureAlgorithm.HS256,signature)
.compact(); //compact()是用来拼接.的
System.out.println(jwtToken);
}
@Test
public void parse(){
String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2NDk4Mzk0MDMsImp0aSI6IjRlMWEzZjc5LTA1ZTUtNGFhMy04ZDg0LTFjZmZiOTgzMjBhOCJ9.FW7Hfvigheuh1zQLL2b0gB-kw4DLE7k45N9-hAqyIEQ";
JwtParser jwtParser = Jwts.parser();
Jws<Claims> claimsJws = jwtParser.setSigningKey(signature).parseClaimsJws(token);
Claims claims = claimsJws.getBody();
System.out.println(claims.get("username"));
System.out.println(claims.get("role"));
System.out.println(claims.getId());
System.out.println(claims.getSubject()); //签名
System.out.println(claims.getExpiration());
}
}
测试结果
生成的token
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2NDk4Mzk0MDMsImp0aSI6IjRlMWEzZjc5LTA1ZTUtNGFhMy04ZDg0LTFjZmZiOTgzMjBhOCJ9.FW7Hfvigheuh1zQLL2b0gB-kw4DLE7k45N9-hAqyIEQ
解密的过程
tom
admin
4e1a3f79-05e5-4aa3-8d84-1cffb98320a8
admin-test
Wed Apr 13 16:43:23 CST 2022
测试案例二
package com.jihu.utils;
import io.jsonwebtoken.Jwt;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class JWTUtils {
private static final String jwtToken = "123456Mszlu!@#$$";
public static String createToken(Long userId){
Map<String,Object> claims = new HashMap<>();
claims.put("userId",userId);
JwtBuilder jwtBuilder = Jwts.builder()
.signWith(SignatureAlgorithm.HS256, jwtToken) // 签发算法,秘钥为jwtToken
.setClaims(claims) // body数据,要唯一,自行设置
.setIssuedAt(new Date()) // 设置签发时间
.setExpiration(new Date(System.currentTimeMillis() + 24 * 60 * 60 * 60 * 1000));// 一天的有效时间
String token = jwtBuilder.compact(); //compact()是用来拼接.的
return token;
}
public static Map<String, Object> checkToken(String token){
try {
Jwt parse = Jwts.parser().setSigningKey(jwtToken).parse(token);
return (Map<String, Object>) parse.getBody();
}catch (Exception e){
e.printStackTrace();
}
return null;
}
//测验一下
public static void main(String[] args) {
String token = JWTUtils.createToken(100L);
System.out.println(token);
Map<String, Object> map = JWTUtils.checkToken(token);
System.out.println(map.get("userId"));
}
}
测试结果为
eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NTA2NDMyMDgsInVzZXJJZCI6MTAwLCJpYXQiOjE2NDk3NTQxNzV9.JpDXT6b-cQCfCB1GRzMupKJ77U_AHWd7r7kjg7YMlVM
100
收藏
关注
评论