猿问

Java 8 Base64 JWT 令牌到 JSON

因此,我在网上和 StackOverflow 上对此进行了一些研究,并且尝试了很多我发现的建议。问题是我正在登录我们的一项运行良好的 Oauth2 服务。我得到一个 Oath2 JWT 令牌。我知道这是 Base64 编码的,我可以将令牌放到 jwt.io 和 www.base64decode.org 中,这两个站点都可以正确解析令牌。


我使用的是 Java 8 Base64 工具,代码如下所示:


public String getTokenProperty(String token, String propertyName)

{

    byte[] bytes = Base64.getUrlDecoder().decode(token);

    String decodedString = new String(bytes, StandardCharsets.UTF_8);

    System.out.println("Decoded: " + decodedString);

    return (new JSONObject(decodedString)).getString(propertyName);

}

解码器线上出现如下错误:


java.lang.IllegalArgumentException: Illegal base64 character 2e

我用我的 Oauth2 服务的令牌尝试了这个,我从 Syncope 得到了一个令牌,我从 Auth0 得到了一个令牌......所有返回都带有 JWT Base64 编码的令牌。使用来自这些不同服务器的所有这些令牌,我得到了同样的错误。


我想使用标准的 Java 8 Base64,但我认为我可能需要使用外部第三方 Base64 解码器。


任何帮助都会很棒。谢谢!


小唯快跑啊
浏览 146回答 2
2回答

MYYA

它不解析的原因是因为您正在尝试对整个令牌进行 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您将看到每个“部分”是如何编码的。它是彩色编码的。

墨色风雨

我使用这个库https://mvnrepository.com/artifact/com.auth0/java-jwt/3.12.0进行解码以获取主题(userId),因此:JWT.decode(token).getSubject()
随时随地看视频慕课网APP

相关分类

Java
我要回答