JWT(JSON Web令牌)
2019-08-02 本文已影响0人
Zn_go
jwt详情网址:
https://jwt.io
注:如果想深入了解可以进入该网站查看,以下内容将结合网上资源与个人理解整合
一、什么是JWT
JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,用于在各方之间作为JSON对象安全地传输信息。此信息可以通过数字签名进行验证和信任。JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名
二、JWT构成
JWT有三部分构成,分别是头、有效载荷、签名:
例如:xxxxxxxx.yyyyyyyyy.zzzzzzzzzzz
头:包含令牌的类型与加密的签名算法
常用算法有:
摘自与jwt.io
有效载荷:通俗一点讲就是token中需要携带的信息都将存于此部分,比如:用户id、权限标志等等信息。
注:该部分信息任何人都可以读出来,所以添加的信息需要加密才会保证信息的安全性
签名:用于验证消息在此过程中未被修改,在具有私钥的情况下,可以验证JWT的准确性
该三部分在构建后会使用Base64Url进行编码,最后生成一个由两点分割成三段的字符串
三、使用JWT工具
构建一个Maven项目,在pom文件中导包
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.8.1</version>
</dependency>
生成token的代码
/**
* zn 生成token
* @return
*/
public static String getToken(){
// 使用HMAC256算法
Algorithm algorithmHS = Algorithm.HMAC256(secret);
// 存放信息的map
Map<String, Object> headerClaims = new HashMap();
// 将信息存入map
headerClaims.put("answer", "654321");
// 生成Token
String token = JWT.create()
// 在头部添加信息
.withHeader(headerClaims)
// 在有效载荷中添加信息
.withClaim("answer","123456")
// 声明发行人
.withIssuer("zn")
// 添加发行主题
.withSubject("zntest")
// 签名接受者
.withAudience("yk")
// 添加生成时间
.withIssuedAt(new Date())
// 签名算法
.sign(algorithmHS);
return token;
}
验证token
/**
* zn 验证token
* @param Token
* @return
*/
public static boolean verifyToken(String token){
// 使用HMAC256算法
Algorithm algorithmHS = Algorithm.HMAC256(secret);
// 生成可重用验证器实例
JWTVerifier verifier = JWT.require(algorithmHS).withIssuer("zn").build();
// 进行验证
DecodedJWT jwt = verifier.verify(token);
return true;
}
获取token的信息
public static void decodeToken(String token){
DecodedJWT jwt = JWT.decode(token);
// 获取token使用的算法
System.out.println(jwt.getAlgorithm());
// 获取头部信息
System.out.println(jwt.getHeaderClaim("answer").asString());
// 获取有效载荷中的信息
Map<String, Claim> claims = jwt.getClaims();
System.out.println(claims.get("answer").asString());
// 获取发行人姓名
System.out.println(jwt.getIssuer());
// 获取发行人主题
System.out.println(jwt.getSubject());
// 获取签名接受者
System.out.println(jwt.getAudience());
// 获取生成日期
System.out.println(jwt.getIssuedAt());
}