使用 Amazon AWS Cognito 时联合身份,并解析数据:
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"},
... }
这可以很好地解码n
使用此代码的字段(Kotlin调用JDK 8 Base64类):
Base64.getDecoder().decode(encodedN.toByteArray())
但是当使用 Cognito 时用户池其中 URL 中的数据格式如下:
https://cognito-idp.${REGION}.amazonaws.com/${POOLID}/.well-known/jwks.json
它具有相同类型的数据,但不会解码。相反,我最终会遇到以下错误:
非法的 base64 字符 5f
因为这是一个下划线_
并在Base64 网址字母表,我尝试将解码更改为:
Base64.getUrlDecoder().decode(encodedN.toByteArray())
但是第一组数据不再正确解码,因为它包含/
以及其他无效字符Base64 网址编码。
有没有一种方法可以同时处理这两个问题jwks
具有相同解码器的数据集?!?
Note: 这个问题是作者特意写出来并回答的(自答问题 https://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/),以便在 SO 中共享有趣问题的解决方案。