2 回答
TA贡献1868条经验 获得超4个赞
它不解析的原因是因为您正在尝试对整个令牌进行 Base64URLDecode。但是您必须解码由点“。”分隔的令牌的部分。字符(十六进制为 0x2e,十进制为 46,html 为 . -- ASCII/UTF8)..
例子:
public static void decodeTokenParts(String token)
{
String[] parts = token.split("\\.", 0);
for (String part : parts) {
byte[] bytes = Base64.getUrlDecoder().decode(part);
String decodedString = new String(bytes, StandardCharsets.UTF_8);
System.out.println("Decoded: " + decodedString);
}
}
这是因为 JWT 令牌由以下部分组成:
Base64URLEncode({HeaderJSON}) + "." + Base64URLEncode({PayloadJSON}) + "." + Signature例如..
所以要解码它..你需要用“。”分割它。并解码每个部分。注意:签名通常是二进制的,编码为 base64,所以一旦你解码它,不要尝试打印它..它会打印字节。您需要验证签名。
For example, if you go to: https://jwt.io/#debugger-io?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
您将看到每个“部分”是如何编码的。它是彩色编码的。
TA贡献1853条经验 获得超6个赞
我使用这个库https://mvnrepository.com/artifact/com.auth0/java-jwt/3.12.0进行解码以获取主题(userId),因此:JWT.decode(token).getSubject()
添加回答
举报