java使用JWT的方法

网友投稿 358 2022-07-26


目录一、简介1.Header2.Payload3.Signature4.组合二、封装类1.引入依赖2.封装方法三、使用方法

一、简介

JWT是token的一种,一个JWT字符串包含三个部分

1.Header

头部信息,一般不需要声明,默认为 HS256 签名算法和 JWT 令牌类型

{

"alg": "HS256", // 指定签名算法

"typ": "JWT" // 指定token令牌类型

}

2.Payload

包含一些默认字段,还可以自定义一些私有字段,但是不要放敏感信息

iss: 发行人exp: 到期时间sub: 主题aud: 用户nbf: 在此之前不可用iat: 发布时间jti: JWT ID用于标识该JWT

3.Signature

数据签名,对上面两部分进行数据签名,Header部分和Payload部分先进行base64Url编码,然后用英文句号拼接并加上一个自定义的secret字符串盐值进行HS256对称加密【也可以用其它算法或非对称加密】

iss: 发行人

exp: 到期时间

sub: 主题

aud: 用户

nbf: 在此之前不可用

iat: 发布时间

jti: JWT ID用于标识该JWT

4.组合

最后将 Header、Payload、Signature三部分用英文句号拼接就生成了完整的JWT

Header.Payload.Signature

二、封装类

1.引入依赖

com.auth0

java-jwt

3.10.3

2.封装方法

package com.cxstar.utils;

import com.auth0.jwt.JWT;

import com.auth0.jwt.JWTCreator;

import com.auth0.jwt.algorithms.Algorithm;

import com.auth0.jwt.interfaces.DecodedJWT;

import com.auth0.jwt.interfaces.JWTVerifier;

import java.util.Calendar;

import java.util.Map;

public class JwtUtKVcweyoVpFil {

// 签名密钥

private static final String SECRET = "hello JWT *%$#$&";

/**

* 生成token

* @param payload token携带的信息

* @return token字符串

*/

public static String generateToken(Map payload){

// 指定token过期时间

Calendar calendar = Calendar.getInstance();

calendar.add(Calendar.HOUR, 24); // 24小时

JWTCreator.Builder builder = JWT.create();

// 构建payload

payload.forEach(builder::withClaim);

// 指定过期时间和签名算法,并返回token

String token = builder.withExpiresAt(calendar.getTime()).sign(Algorithm.HMAC256(SECRET));

return token;

}

/**

* 解析token

* @param token token字符串

* @return 解析后的token类

*/

public static DecodedJWT decodeToken(String token){

JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SECRET)).build();

DecodedJWT decodedJWT = jwtVerifier.verify(token);

return decodedJWT;

}

}

三、使用方法

package com.cxstar;

import com.auth0.jwt.exceptions.JWTDecodeException;

import com.auth0.jwt.exceptions.TokenExpiredException;

import com.auth0.jwt.interfaces.DecodedJWT;

import com.cxstar.utils.JwtUtil;

import org.junit.jupiter.api.Test;

import org.springframework.boot.test.context.SpringBootTest;

import java.util.HashMap;

import java.util.Map;

@SpringBootTest

class JwtLoginApplicationTests {

@Test

void tokenTest() {

// 根据用户信息生成令牌 --------------------------

MapKVcweyoVpF payload = new HashMap<>();

payload.put("userId", "233");

payload.put("userName", "ps");

String token = JwtUtil.generateToken(payload);

System.out.println("token: " + token);

// --------------------------------------------

// 解析令牌并获取用户信息 ------------------------------------------------

try {

DecodedJWT decodedJWT = JwtUtil.decodeToken(token);

String userId = decodedJWT.getClaim("userId").asString();

String userName = decodedJWT.getClaim("userName").asString();

String exp = decodedJWT.getExpiresAt().toString();

System.out.println("userId: " + userId); // 取出自定义属性【用户id】

System.out.println("userName: " + userName); // 取出自定义属性【用户名】

System.out.println("exp: " + exp); // 取出默认属性【过期时间】

} catch (JWTDecodeException e) {

System.out.println("令牌错误");

} catch (TokenExpiredException e) {

System.out.println("令牌过期");

}

// -------------------------------------------------------------------

}

}

ps:最后附一篇写的很详细的JWT文章https://jb51.net/article/250529.htm


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:mybatis中 if
下一篇:Mybatis中&lt;if&gt;和&lt;choose&gt;的区别及“=”判断方式
相关文章

 发表评论

暂时没有评论,来抢沙发吧~