当我尝试将jwt中的标头解析为base64到字符串时,输出为:
{“ alg”:“ RS256”,“ typ”:“ JWT”,“ kid”:“ 1234”
没有最后一个括号,但是当我在以下示例中解码相同的base64字符串时:https://www.base64decode.org/,那么json的格式正确。
我使用的功能:
public void test() {
String encodedToken = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMzQifQ";
System.out.println(new String(DatatypeConverter.parseBase64Binary(encodedToken)));
}
有什么问题吗?
编辑:Java 7是必需的。
答案 0 :(得分:2)
尝试在base64中编码{"alg":"RS256","typ":"JWT","kid":"1234"}
您将看到eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMzQifQ==
==
-是padding
我认为问题是DatatypeConverter.parseBase64Binary
使用xsd:base64Binary的表示形式(RFC 2045)。但是在RFC 2045中,填充是强制性的。
您可以使用这种方式(java.util.Base64):
public void test() {
String encodedToken = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMzQifQ";
System.out.println(new String(Base64.getDecoder().decode(encodedToken.getBytes())));
}
java.util.Base64使用RFC 4648(填充为可选)。
答案 1 :(得分:0)
,欢迎使用StackOverflow。
根据Github上的this答案,DatatypeConverter.parseBase64Binary()
存在一些错误,无法输出正确的解码字符串。
如果您使用的是Java 8或更高版本,则可以通过以下方式进行解码:
String base64 = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMzQifQ";
byte[] temp = Base64.getDecoder().decode(base64.getBytes());
System.out.println(new String(temp));
导入类java.util.Base64