如何使用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
相关产品推荐
相关产品推荐

