You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用java-jwt从JWT令牌获取Header/Payload的JSON字符串

Auth0 java-jwt 获取JSON格式Header/Payload的解决方案

问题解答

首先明确:

  • Auth0 java-jwt库没有内置直接返回Header/Payload为JSON字符串的方法,getHeader()和getPayload()仅返回Base64编码后的内容;
  • JJWT库同样没有提供这类一键生成JSON的API,但两者都可以通过手动解码Base64编码内容的方式实现你想要的效果。

JWT的Header和Payload本质上就是JSON字符串经过Base64Url编码后的结果,所以我们只需要对编码后的字符串进行Base64解码,就能得到像jwt.io展示的原始JSON格式内容。

完整实现代码

我们可以借助Apache Commons Codec库的Base64工具类来完成解码(需要先引入该依赖),完整代码如下:

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.StringUtils;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

public class CreateTokenExampleIntegrationTest {
    private static final Logger logger = LoggerFactory.getLogger(CreateTokenExampleIntegrationTest.class);

    @Test
    public void shouldCreateToken() {
        logger.info("Starting test...");
        // 创建JWT令牌
        String key = "foobarkey";
        Algorithm alg = Algorithm.HMAC256(key);
        String issuer = "me";
        JWTCreator.Builder jwt = JWT.create();
        jwt.withIssuer(issuer);
        jwt.withClaim("createdBy", "CreateTokenExampleIntegrationTest");
        jwt.withClaim("purpose", "test");
        jwt.withClaim("msg", "Hello World.");
        String token = jwt.sign(alg);
        logger.info("Created token: \n" + token);

        // 验证并解析令牌
        JWTVerifier verifier = JWT.require(alg)
                .withIssuer(issuer)
                .build();
        DecodedJWT decoded = verifier.verify(token);

        // 解码Header为JSON
        String encHeader = decoded.getHeader();
        String headerJson = decodeBase64(encHeader);
        logger.info("Header: \n" + encHeader + "\n" + headerJson);

        // 解码Payload为JSON
        String encPayload = decoded.getPayload();
        String payloadJson = decodeBase64(encPayload);
        logger.info("Payload: \n" + encPayload + "\n" + payloadJson);

        logger.info("Done.");
    }

    /**
     * 解码Base64字符串为UTF-8格式的JSON
     */
    private String decodeBase64(final String base64) {
        return StringUtils.newStringUtf8(Base64.decodeBase64(base64));
    }
}

输出结果

运行上述代码后,你会得到如下输出,其中包含了编码后的原始内容以及解码后的JSON格式内容:

2020-05-19 10:13:29,146 10:13:29.146 [main] INFO (CreateTokenExampleIntegrationTest.java:21) - Starting test...
2020-05-19 10:13:30,031 10:13:30.031 [main] INFO (CreateTokenExampleIntegrationTest.java:32) - Created token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJtc2ciOiJIZWxsbyBXb3JsZC4iLCJjcmVhdGVkQnkiOiJDcmVhdGVUb2tlbkV4YW1wbGVJbnRlZ3JhdGlvblRlc3QiLCJwdXJwb3NlIjoidGVzdCIsImlzcyI6Im1lIn0.VmYsToj1PKBzJKQuXEyiKuJA-GkNVit0Ylh44dVF2UI
2020-05-19 10:13:30,102 10:13:30.102 [main] INFO (CreateTokenExampleIntegrationTest.java:41) - Header: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9 {"typ":"JWT","alg":"HS256"}
2020-05-19 10:13:30,103 10:13:30.103 [main] INFO (CreateTokenExampleIntegrationTest.java:45) - Payload: eyJtc2ciOiJIZWxsbyBXb3JsZC4iLCJjcmVhdGVkQnkiOiJDcmVhdGVUb2tlbkV4YW1wbGVJbnRlZ3JhdGlvblRlc3QiLCJwdXJwb3NlIjoidGVzdCIsImlzcyI6Im1lIn0 {"msg":"Hello World.","createdBy":"CreateTokenExampleIntegrationTest","purpose":"test","iss":"me"}
2020-05-19 10:13:30,103 10:13:30.103 [main] INFO (CreateTokenExampleIntegrationTest.java:47) - Done.

补充说明

如果需要对JSON进行格式化(换行、缩进),可以额外引入JSON处理库(如Jackson或Gson),将解码后的字符串解析为JSON对象再格式化输出。例如用Gson的话,可以添加以下代码:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

// ... 在解码后添加
Gson gson = new GsonBuilder().setPrettyPrinting().create();
Object headerObj = gson.fromJson(headerJson, Object.class);
String formattedHeader = gson.toJson(headerObj);
logger.info("Formatted Header: \n" + formattedHeader);

这样就能得到更易读的格式化JSON了。


内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 18:17:41