gpt4 book ai didi

Java 8 Base64 JWT token 转换为 JSON

转载 作者:行者123 更新时间:2023-12-04 14:30:25 25 4
gpt4 key购买 nike

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

我使用的是 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 服务的 token 尝试了这个,我从 Syncope 得到了一个 token ,我从 Auth0 得到了一个 token ......所有这些都返回了 JWT Base64 编码的 token 。
使用来自这些不同服务器的所有这些 token ,我得到了同样的错误。

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

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

token 如下:
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ik1qSTRRVFEwT1VRNU9VSXlSVEV6TlRBd05UVXpSVVExTlVOR05FVkVORGRDTlRnM016VXdRZyJ9.eyJodHRwczovL2JpdG9vbXRyYWRlci5uZXQvYXV0aG9yaXphdGlvbiI6eyJncm91cHMiOlsiQ29uc3VtZXJzIl0sInJvbGVzIjpbIlVzZXIiXX0sImlzcyI6Imh0dHBzOi8vYml0em9vbS5hdXRoMC5jb20vIiwic3ViIjoiYXV0aDB8NWNhNTE5NzZjYzMzZjUxMTBhYWNkYmM0IiwiYXVkIjpbImh0dHBzOi8vYml0em9vbS5hdXRoMC5jb20vYXBpL3YyLyIsImh0dHBzOi8vYml0em9vbS5hdXRoMC5jb20vdXNlcmluZm8iXSwiaWF0IjoxNTU5MzIzNDI1LCJleHAiOjE1NTk0MDk4MjUsImF6cCI6IlliRGFSelRVQkFtZEFrSExqdjZ0bEI3U05xSTF1RlNtIiwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSBlbWFpbCBhZGRyZXNzIHBob25lIHJlYWQ6Y3VycmVudF91c2VyIHVwZGF0ZTpjdXJyZW50X3VzZXJfbWV0YWRhdGEgZGVsZXRlOmN1cnJlbnRfdXNlcl9tZXRhZGF0YSBjcmVhdGU6Y3VycmVudF91c2VyX21ldGFkYXRhIGNyZWF0ZTpjdXJyZW50X3VzZXJfZGV2aWNlX2NyZWRlbnRpYWxzIGRlbGV0ZTpjdXJyZW50X3VzZXJfZGV2aWNlX2NyZWRlbnRpYWxzIHVwZGF0ZTpjdXJyZW50X3VzZXJfaWRlbnRpdGllcyIsImd0eSI6InBhc3N3b3JkIn0.St7097L1ZAlBWcAPrie-8CGV2F3Fr8uNYpSDVKSPVPF4zBZrmm62_UAj7Ssux8AjUy0LhjiF3kLpNph2L7yrpUREw6TyGJwQasfdVtM5VzRYUcy-fOGyRSqPQorbzxJQZzs2pyDJm-2hMQ0McJ37ubKIWrHFD5McMedN6THK7g5TExX47XCRPcOuCEWm3bf3zdWF2LEGhCw_c-lcZDwlb4ePkO721XjSWtrXEBvxc8scFNaHDt7VOnrSze4XK_LO8eE8bHRq6qUrWf1csYucK--aHazBsvfdl-6QDRk-tOBM-LdXJMT7H8Ih6trxVmZofQjr2dQ4j_3DTVoU3eLdog

更新:

我从 java,util.Base64 切换到 org.apache.commons.codec.binary.Base64
这似乎有点奏效,我现在没有收到错误消息。
String decodedString = new String(bytes, StandardCharsets.UTF_8);

给我一个包含标题、有效载荷和签名数据的字符串。所以,当我这样做时:
JSONObject jsonObject = new JSONObject(decodedString);
System.out.println("getTokenProperty: jsonObject = " + jsonObject.toString());

我只取回 header 数据,而我真正需要的是有效载荷。

为了记录......我从“概念证明”项目继承的代码是:
public static String getTokenProperty(String token, String propertyName)
{
return (new JSONObject(new String(Base64.getDecoder().decode(token)))).getString(propertyName);
}

并且根本没有单元测试。所以,当我去单元测试时,它当然完全坏了。所以,现在我对如何解析这个token有了更好的理解,这个教训我会记住很久。

非常感谢!

最佳答案

它不解析的原因是因为您正在尝试 Base64URLDecode 整个 token .. 但是您必须解码由 DOT“.”分隔的 token 的一部分。字符(十六进制为 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 token 由以下部分组成:
Base64URLEncode({HeaderJSON}) + "." + Base64URLEncode({PayloadJSON}) + "." + Signature例如..

所以要解码它.. 你需要用“.”分割它。并解码每个部分。注意:签名通常是被编码为 base64 的二进制,所以一旦你解码它,不要尝试打印它......它会打印字节。您需要验证签名。

例如,如果您访问: https://jwt.io/#debugger-io?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

您将看到每个“部分”是如何编码的。它是彩色编码的。

关于Java 8 Base64 JWT token 转换为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56399692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com