我有一个由某些服务生成的JWT令牌,然后在我的Java应用程序上进行验证。
问题是由于base64解码错误,JJWT库无法解析JSON头。
头Base64代码:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InRva2VuLXNpZ25pbmcifQ
由JJWT解码(归结为调用:new String(javax.xml.bind.DatatypeConverter.parseBase64Binary(myBase64), java.nio.charset.Charset.forName("UTF-8")))):
{"alg":"RS256","typ":"JWT","kid":"token-signing"所以最后的卷发支架丢了。
然而,当我尝试与其他解码器(https://www.base64decode.org/)ше-最后的卷曲大括号到位。
对于其他开发人员来说,同样的代码也可以工作。
在Java中影响Base64解码的可能是特定的环境吗?
发布于 2017-03-28 12:08:40
JWT的头和有效载荷是base64 url编码的,这与base64略有不同(用-、_替换+、\和删除尾随=)。
使用此代码DatatypeConverter.parseBase64Binary解码标头是错误的。需要使用:
java.util.Base64.getUrlDecoder().decode(string);我已经检查了JJWT的代码,并以正确的方式解码了标题。看看DefaultJWTSParser第255行
String origValue = TextCodec.BASE64URL.decodeToString(base64UrlEncodedHeader);也许你在使用其他图书馆?
发布于 2017-03-28 09:37:25
您收到的头是Base64 无输出填充 (请注意,有66个字符,它不是4的倍数)。指定了DatatypeConverter.parseBase64Binary来解析XML xsd:base64Binary类型,需要输出填充。显然,它将结尾处的非填充字符视为无效字符,并简单地忽略它们。
要么使用不同的解码器(Java 8有java.util.Base64、Apache Commons.Codec有一个、番石榴也有,或者自己填充输出)(如果删除所有非Base64 64字符后的字符串长度不能被4整除,pad有'=‘直到它是’=‘)。
https://stackoverflow.com/questions/43065553
复制相似问题