【发布时间】:2020-09-05 12:27:24
【问题描述】:
java-jwt 中是否有一种方法可以将令牌作为单个 JSON 字符串(或至少将标头和有效负载作为两个 JSON 字符串)返回? JJWT 支持吗?
查看https://github.com/auth0/java-jwt 的教程,我没有看到这种方法(消息的各个部分有单独的 getter,但我没有看到任何将完整消息作为 JSON 字符串返回的内容)。
getHeader() 和 getHeader() 方法返回编码字符串。我正在尝试以 JSON 格式获取标头和有效负载(类似于https://jwt.io/ 中显示的内容)。我该怎么做?
到目前为止的代码如下:
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...");
// create the token
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);
// read the token
JWTVerifier verifier = JWT.require(alg)
.withIssuer(issuer)
.build();
DecodedJWT decoded = verifier.verify(token);
logger.info("Header: \n" + decoded.getHeader());
logger.info("Payload: \n" + decoded.getPayload());
logger.info("Done.");
}
}
这是输出:
2020-05-19 08:23:31,387 08:23:31.387 [main] INFO (CreateTokenExampleIntegrationTest.java:19) - Starting test...
2020-05-19 08:23:32,226 08:23:32.226 [main] INFO (CreateTokenExampleIntegrationTest.java:30) - Created token:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJtc2ciOiJIZWxsbyBXb3JsZC4iLCJjcmVhdGVkQnkiOiJDcmVhdGVUb2tlbkV4YW1wbGVJbnRlZ3JhdGlvblRlc3QiLCJwdXJwb3NlIjoidGVzdCIsImlzcyI6Im1lIn0.VmYsToj1PKBzJKQuXEyiKuJA-GkNVit0Ylh44dVF2UI
2020-05-19 08:23:32,273 08:23:32.273 [main] INFO (CreateTokenExampleIntegrationTest.java:36) - Header:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
2020-05-19 08:23:32,273 08:23:32.273 [main] INFO (CreateTokenExampleIntegrationTest.java:37) - Payload:
eyJtc2ciOiJIZWxsbyBXb3JsZC4iLCJjcmVhdGVkQnkiOiJDcmVhdGVUb2tlbkV4YW1wbGVJbnRlZ3JhdGlvblRlc3QiLCJwdXJwb3NlIjoidGVzdCIsImlzcyI6Im1lIn0
2020-05-19 08:23:32,273 08:23:32.273 [main] INFO (CreateTokenExampleIntegrationTest.java:38) - Done.
编辑:这是基于公认答案的完整解决方案:
代码:
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...");
// create the token
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);
// read the token
JWTVerifier verifier = JWT.require(alg)
.withIssuer(issuer)
.build();
DecodedJWT decoded = verifier.verify(token);
// header
String encHeader = decoded.getHeader();
String header = decode(encHeader);
logger.info("Header: \n" + encHeader + "\n" + header);
// payload
String encPayload = decoded.getPayload();
String payload = decode(encPayload);
logger.info("Payload: \n" + encPayload + "\n" + payload);
// done
logger.info("Done.");
}
public String decode(final String base64) {
return StringUtils.newStringUtf8(Base64.decodeBase64(base64));
}
}
输出:
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.
【问题讨论】: