JAVA全系列 教程
3762个小节阅读:7090.7k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
在网站用户服务模块引入JWT依赖
xxxxxxxxxx
<!-- jwt -->
<dependency>
<groupId>org.bitbucket.b_c</groupId>
<artifactId>jose4j</artifactId>
<version>0.7.0</version>
</dependency>
在网站用户服务模块编写生成公钥和私钥的工具类
xxxxxxxxxx
// 生成公钥和私钥
public class GenerateJwtDemo {
public static void main(String[] args) throws JoseException {
RsaJsonWebKey rsaJsonWebKey = RsaJwkGenerator.generateJwk(2048);
final String publicKeyString = rsaJsonWebKey.toJson(JsonWebKey.OutputControlLevel.PUBLIC_ONLY);
final String privateKeyString = rsaJsonWebKey.toJson(JsonWebKey.OutputControlLevel.INCLUDE_PRIVATE);
System.out.println(publicKeyString);
System.out.println(privateKeyString);
}
}
在网站用户服务模块编写JWT工具类
xxxxxxxxxx
public class JwtUtils {
// 私钥
public final static String PRIVATE_JSON = "";
// 公钥
public final static String PUBLIC_JSON = "";
/**
* 生成token
*
* @param userId 用户id
* @param username 用户名字
* @return
*/
@SneakyThrows
public static String sign(Long userId, String username) {
// 1、 创建jwtclaims jwt内容载荷部分
JwtClaims claims = new JwtClaims();
// 是谁创建了令牌并且签署了它
claims.setIssuer("itbaizhan");
// 令牌将被发送给谁
claims.setAudience("audience");
// 失效时间长 (分钟)
claims.setExpirationTimeMinutesInTheFuture(60 * 24);
// 令牌唯一标识符
claims.setGeneratedJwtId();
// 当令牌被发布或者创建现在
claims.setIssuedAtToNow();
// 再次之前令牌无效
claims.setNotBeforeMinutesInThePast(2);
// 主题
claims.setSubject("shopping");
// 可以添加关于这个主题得声明属性
claims.setClaim("userId", userId);
claims.setClaim("username", username);
// 2、签名
JsonWebSignature jws = new JsonWebSignature();
//赋值载荷
jws.setPayload(claims.toJson());
// 3、jwt使用私钥签署
PrivateKey privateKey = new RsaJsonWebKey(JsonUtil.parseJson(PRIVATE_JSON)).getPrivateKey();
jws.setKey(privateKey);
// 4、设置关键 kid
jws.setKeyIdHeaderValue("keyId");
// 5、设置签名算法
jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256);
// 6、生成jwt
String jwt = jws.getCompactSerialization();
return jwt;
}
/**
* 解密token,获取token中的信息
*
* @param token
*/
@SneakyThrows
public static Map<String, Object> verify(String token){
// 1、引入公钥
PublicKey publicKey = new RsaJsonWebKey(JsonUtil.parseJson(PUBLIC_JSON)).getPublicKey();
// 2、使用jwtcoonsumer 验证和处理jwt
JwtConsumer jwtConsumer = new JwtConsumerBuilder()
.setRequireExpirationTime() //过期时间
.setAllowedClockSkewInSeconds(30) //允许在验证得时候留有一些余地 计算时钟偏差 秒
.setRequireSubject() // 主题生命
.setExpectedIssuer("itbaizhan") // jwt需要知道谁发布得 用来验证发布人
.setExpectedAudience("audience") //jwt目的是谁 用来验证观众
.setVerificationKey(publicKey) // 用公钥验证签名 验证密钥
.setJwsAlgorithmConstraints(new AlgorithmConstraints(AlgorithmConstraints.ConstraintType.WHITELIST, AlgorithmIdentifiers.RSA_USING_SHA256))
.build();
// 3、验证jwt 并将其处理为 claims
try {
JwtClaims jwtClaims = jwtConsumer.processToClaims(token);
return jwtClaims.getClaimsMap();
}catch (Exception e){
return new HashMap();
}
}
public static void main(String[] args){
// 生成
String baizhan = sign(1001L, "baizhan");
System.out.println(baizhan);
Map<String, Object> stringObjectMap = verify(baizhan);
System.out.println(stringObjectMap.get("userId"));
System.out.println(stringObjectMap.get("username"));
}
}