我怎样才能从智威汤逊获得索赔?
How can I get Claims from a JWT?
我需要从 JWT 中提取声明。
看来这应该是一个no-brainer.
已签名,从 header 我得到:
{
"alg": "RS256",
"typ": "JWT"
}
智威汤逊:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJtYXJrLnN0YW5nQGRoaWdyb3VwaW5jLmNvbSIsInNjb3BlIjpbIm9wZW5pZCJdLCJyb2xlcyI6WyJKT0JTRUVLRVIiXSwiam9ic2Vla2VySWQiOiJ3TDFkTWdQckZWOUl5dEZZIiwiZXhwIjoxNDg4Mzk1ODE5LCJhdXRob3JpdGllcyI6WyJKT0JTRUVLRVIiXSwianRpIjoiNWRiYjNkYzQtNGI3NC00MDYyLTgzMmQtYjE1MTgwYWZhZjllIiwiY2xpZW50X2lkIjoiZWZjIn0.NxiF4x39na3KdDUFz2zxqy1zSfJkj4FdKHflpgJUxzMgBq8bbJIFVkmwAUYA6_YXm6kGFcyTMgdiRIJpqc5buDPdV1vkzh4QKFTxMz9MF4i3vtIQ21Vm5W12KikWdWGGUXMD4udJwu7rmuIBtNIa-ciZOPADNrrXfuw7iML1xxAA-C0f4OTbiKqiXr3QEUZwcqZB17qfh_dVRRxgO-_uHUg84JDcpXEDQPzPWX68u1EHH4J6IcpMKn1VY9k3RcZU6pq-ndzQgBlKdVm2owA6i-UM9p1zSz7ZX_2wx0czEEcNF1rMdeIv5yxP9YEpWb14-GUG4qgpn_rAIQBJ7eu7xw
它在 jwt.io 站点上解码很好,但由于我没有 "secret" 密钥,它显示为 "invalid signature"。没关系,我不是要验证它。
我想要的只是声明,但是当我使用 Java 库对其进行解码时,我除了错误什么也得不到。
如果我手动解码(即 split/base64 解码)就可以了。
那么,我在 Java 库中做错了什么?
一旦问题被标记为 jose4j, I understand you are using jose4j 以解析 JWT 令牌。
在这种情况下,您可以调用setSkipSignatureVerification()
from the JwtConsumerBuilder
。它允许您在不验证签名的情况下解析声明:
JwtConsumer jwtConsumer = new JwtConsumerBuilder()
.setSkipSignatureVerification()
.build();
JwtClaims jwtClaims = jwtConsumer.processToClaims(jwt);
我提供一个大概的答案,供大家使用。
我正在使用这个 maven/gradle library。将以下内容用于 Maven。
<dependency>
<groupId>com.nimbusds</groupId>
<artifactId>nimbus-jose-jwt</artifactId>
<version>[ version ]</version>
</dependency>
然后使用下面的代码解码得到声明。
String jwtToken = "eyJ0eXAiOiJKV1QiLCJhbG...";
JWSObject jwsObject;
JWTClaimsSet claims;
try {
jwsObject = JWSObject.parse(this.jwt);
claims = JWTClaimsSet.parse(jwsObject.getPayload().toJSONObject());
} catch (java.text.ParseException e) {
// Invalid JWS object encoding
}
// now access any claims you want using the relevant key. It will be returned as an object
Object expiry = claims.getClaim("exp");
我需要从 JWT 中提取声明。
看来这应该是一个no-brainer.
已签名,从 header 我得到:
{
"alg": "RS256",
"typ": "JWT"
}
智威汤逊:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJtYXJrLnN0YW5nQGRoaWdyb3VwaW5jLmNvbSIsInNjb3BlIjpbIm9wZW5pZCJdLCJyb2xlcyI6WyJKT0JTRUVLRVIiXSwiam9ic2Vla2VySWQiOiJ3TDFkTWdQckZWOUl5dEZZIiwiZXhwIjoxNDg4Mzk1ODE5LCJhdXRob3JpdGllcyI6WyJKT0JTRUVLRVIiXSwianRpIjoiNWRiYjNkYzQtNGI3NC00MDYyLTgzMmQtYjE1MTgwYWZhZjllIiwiY2xpZW50X2lkIjoiZWZjIn0.NxiF4x39na3KdDUFz2zxqy1zSfJkj4FdKHflpgJUxzMgBq8bbJIFVkmwAUYA6_YXm6kGFcyTMgdiRIJpqc5buDPdV1vkzh4QKFTxMz9MF4i3vtIQ21Vm5W12KikWdWGGUXMD4udJwu7rmuIBtNIa-ciZOPADNrrXfuw7iML1xxAA-C0f4OTbiKqiXr3QEUZwcqZB17qfh_dVRRxgO-_uHUg84JDcpXEDQPzPWX68u1EHH4J6IcpMKn1VY9k3RcZU6pq-ndzQgBlKdVm2owA6i-UM9p1zSz7ZX_2wx0czEEcNF1rMdeIv5yxP9YEpWb14-GUG4qgpn_rAIQBJ7eu7xw
它在 jwt.io 站点上解码很好,但由于我没有 "secret" 密钥,它显示为 "invalid signature"。没关系,我不是要验证它。
我想要的只是声明,但是当我使用 Java 库对其进行解码时,我除了错误什么也得不到。
如果我手动解码(即 split/base64 解码)就可以了。
那么,我在 Java 库中做错了什么?
一旦问题被标记为 jose4j, I understand you are using jose4j 以解析 JWT 令牌。
在这种情况下,您可以调用setSkipSignatureVerification()
from the JwtConsumerBuilder
。它允许您在不验证签名的情况下解析声明:
JwtConsumer jwtConsumer = new JwtConsumerBuilder()
.setSkipSignatureVerification()
.build();
JwtClaims jwtClaims = jwtConsumer.processToClaims(jwt);
我提供一个大概的答案,供大家使用。
我正在使用这个 maven/gradle library。将以下内容用于 Maven。
<dependency>
<groupId>com.nimbusds</groupId>
<artifactId>nimbus-jose-jwt</artifactId>
<version>[ version ]</version>
</dependency>
然后使用下面的代码解码得到声明。
String jwtToken = "eyJ0eXAiOiJKV1QiLCJhbG...";
JWSObject jwsObject;
JWTClaimsSet claims;
try {
jwsObject = JWSObject.parse(this.jwt);
claims = JWTClaimsSet.parse(jwsObject.getPayload().toJSONObject());
} catch (java.text.ParseException e) {
// Invalid JWS object encoding
}
// now access any claims you want using the relevant key. It will be returned as an object
Object expiry = claims.getClaim("exp");