解析Auth0 JWT声明时出现一些问题


public Map<String, String> verifyToken(final String token) throws NoSuchAlgorithmException, InvalidKeySpecException {
final Algorithm algorithm = Algorithm.RSA256(getPublicKey());
final JWTVerifier verifier = JWT.require(algorithm).withIssuer(tokenConfiguration.getIssuer()).build();
try {
final DecodedJWT decodedJWT = verifier.verify(token);
return decodedJWT.getClaims().entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, x -> x.getValue().toString()));
} catch (final JWTVerificationException jwtVerificationException) {
throw new RuntimeException();
}
}

我有这样的代码,它基本上验证令牌并作为HashMap 检索声明

final String phone = Optional
.ofNullable(claimMap.get("phone"))
.orElseThrow(() -> new RuntimeException());

当我试图从Hashmap中获取phoneNumber时,它返回正确的电话,但"1231551921"错误的时尚。如何去掉多余的引号?

我的问题是如何以正确的方式解析JWT索赔?

我的带有RSA-256:的jwt代币

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJwaG9uZSI6IjA1MzgqKio3NSoqIiwiaXNzIjoidGVzdC5jb20iLCJleHAiOjE2NDkyNTM5ODcsImp0aSI6InJlZnJlc2hfdG9rZW4ifQ.SbLRBFCjaePFu8kjmYRrBfj6iHWBJoLzABwD2d8vxIQlEM2ZZXzJ9wUCu_MiIZ7B6M5k4aRtjdg4TDEJ3HvwnAQMl63P5C46iKaDmmhg4-hx0M_alwo8f5iDuQ2BAInPiPVo4qjFQQqN_Yti0qfW2amGGwvA5yTXK1D4NONR6B7CPY1SrqPgnZ9Q2zZv039SxbsdQTtZ2u80sA2b8kmAoK69NZt6PadSFRjdXy-VMzuG5HitSvtP4xLplFGfvptHg0DrNeGEy4daqofbBXYybPbPi0VQ3mxSjYaK2EIOFOm2FJDISQ_7sZXy6pwOYepKR5CfNAzRskM_Tpf6G2Nt9g

问题出在这一行:

return decodedJWT.getClaims().entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, x -> x.getValue().toString()));

dictionary值是Claim实例,Claim实例基本上是JSON片段,因此它们可以是数字、字符串、数组或dictionary。

如果调用了通用toString()方法,则对结果进行格式化,以便可以安全地区分类型,例如:

  • 37表示数字
  • 字符串的"+1231551921"
  • 阵列的[ 37, "+1231551921" ]

如果您确定您的索赔类型为字符串,请调用asString()而不是toString()

最新更新