JWT token生成原理

本文介绍了JWT(JSON Web Token)的组成,包括Header、Payload和Signature三部分,并详细讲解了如何使用java-jwt库在Java中生成和解析JWT Token。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

token生成规则:

JWT包含三部分:Header(头部),Payload(负载),Signature(签名)

//Signature生成
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
//通过header中声明的加密方式进行加盐secret组合加密
var signature = HMACSHA256(encodedString, secret);
 
//token生成,用.连接三部分组成一个完整的字符串
var token=base64UrlEncode(header)+'.'+base64UrlEncode(payload)+'.'+signature;

token生成工具依赖包:com.auth0:java-jwt:3.9.0

基于生成规则,token生成

private static String manualToken(String secret) throws JsonProcessingException {
        ObjectMapper mapper=new ObjectMapper();
        //生成header
        Map<String,String> header=new HashMap<>();
        header.put("alg","HS256");
        header.put("typ","JWT");
        byte[] headerBytes = mapper.writeValueAsBytes(header);
        String headerPart = new String(Base64.encodeBase64(headerBytes,false ,true), StandardCharsets.US_ASCII);
        
		//生成playload,存放传递信息
        Map<String,String> mapPlayload=new HashMap<>();
        mapPlayload.put("appId","appId");
        mapPlayload.put("phone","phone");
        byte[] payloadBytes = OBJECT_MAPPER.writeValueAsBytes(mapPlayload);
        String payloadPart = new String(Base64.encodeBase64(payloadBytes,false ,true), StandardCharsets.UTF_8);
        
		//生成signature
        String content = headerPart + "." + payloadPart;
        Mac mac = HmacUtils.getInitializedMac(HmacAlgorithms.HMAC_SHA_256, secret.getBytes(StandardCharsets.UTF_8));
        byte[] output = mac.doFinal(content.getBytes(StandardCharsets.UTF_8));
        String signaturePart = new String(Base64.encodeBase64(output, false ,true), StandardCharsets.UTF_8);
        String token=headerPart+"."+payloadPart+"."+signaturePart;
        return token;
    }

依赖包,token生成代码:

private static String getToken(String secret){
        String appId="appId";
        String phone="phone";
        String token= JWT.create()
                .withClaim("appId",appId)
                .withClaim("phone",phone)
                .sign(Algorithm.HMAC256(secret));
        return token;
    }

token解析代码:

private static void getInfo(String token,String secret){
        HashMap<String,String> map=new HashMap<>();
        DecodedJWT jwt=JWT.require(Algorithm.HMAC256(secret)).build().verify(token);
        String appId=jwt.getClaim("appId").asString();
        String phone=jwt.getClaim("phone").asString();
        log.info("appId is {}",appId);
        log.info("phone is {}",phone);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值