Jay*_*ard 5 java amazon-web-services kotlin amazon-cognito
使用 Amazon AWS Cognito Federated Identities并解析以下位置的数据时:
https://cognito-identity.amazonaws.com/.well-known/jwks_uri如下所示:
{"keys":[
{"kty":"RSA",
"alg":"RS512",
"use":"sig",
"kid":"ap-northeast-11",
"n":"AI7mc1assO5n6yB4b7jPCFgVLYPSnwt4qp2BhJVAmlXRntRZ5w4910oKNZDOr4fe/BWOI2Z7upUTE/ICXdqirEkjiPbBN/duVy5YcHsQ5+GrxQ/UbytNVN/NsFhdG8W31lsE4dnrGds5cSshLaohyU/aChgaIMbmtU0NSWQ+jwrW8q1PTvnThVQbpte59a0dAwLeOCfrx6kVvs0Y7fX7NXBbFxe8yL+JR3SMJvxBFuYC+/om5EIRIlRexjWpNu7gJnaFFwbxCBNwFHahcg5gdtSkCHJy8Gj78rsgrkEbgoHk29pk8jUzo/O/GuSDGw8qXb6w0R1+UsXPYACOXM8C8+E=",
"e":"AQAB"},
... }
Run Code Online (Sandbox Code Playgroud)
n使用以下代码(Kotlin 调用 JDK 8 Base64 类)可以很好地解码字段:
Base64.getDecoder().decode(encodedN.toByteArray())
Run Code Online (Sandbox Code Playgroud)
但是,当使用 Cognito用户池时,其 URL 中的数据格式如下:
https://cognito-idp.${REGION}.amazonaws.com/${POOLID}/.well-known/jwks.json
它具有相同类型的数据,但不会解码。相反,我最终会遇到以下错误:
非法的 base64 字符 5f
由于这是一个下划线_并且在Base64 URL字母表中,我尝试将解码更改为:
Base64.getUrlDecoder().decode(encodedN.toByteArray())
Run Code Online (Sandbox Code Playgroud)
但随后第一组数据将不再正确解码,因为它包含Base64 URL/编码的其他无效字符。
有没有一种方法可以使用jwks同一个解码器处理这两组数据?!?
注: 这个问题是作者特意写出来并回答的(自答问题),以便在SO中分享有趣问题的解决方案。
问题在于 Amazon AWS Cognito 团队使用两种不同的 Base64 编码字母表来处理基本相同的事情。因此,您需要检测正在使用哪个。
如果编码后的字符串以=或 包含+或结尾,/那么它肯定是正常的Base64.getDecoder()。如果它包含-或_那么它肯定是Base64.getUrlDecoder()。否则没有什么特别的,最好使用,Base64.getUrlDecoder()因为你不知道长度是否需要填充。
这可以翻译为(在 Kotlin 中,但逻辑上适用于任何语言):
fun base64SafeDecoder(encoded: String): ByteArray {
val decoder = if (encoded.endsWith('=') || encoded.any { it == '+' || it == '/' }) {
Base64.getDecoder()
}
else {
Base64.getUrlDecoder()
}
return decoder.decode(encoded.toByteArray())
}
Run Code Online (Sandbox Code Playgroud)
对于任何具有 Base64 解码的语言来说,这都将是一个问题,因为它们可能会宽松并忽略无效字符(有些会这样做),或者它们可能会严格并引发异常。一些 Base64 编码/解码的测试网站也表现出这两种行为,并且默默地忽略无效字符是危险的。稍后使用解码结果时会出现错误。
| 归档时间: |
|
| 查看次数: |
2214 次 |
| 最近记录: |