- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
当使用 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"},
... }
使用此代码(Kotlin 调用 JDK 8 Base64 类)可以很好地解码 n
字段:
Base64.getDecoder().decode(encodedN.toByteArray())
但是当使用 Cognito User Pools 时,其 URL 中的数据格式为:
https://cognito-idp.${REGION}.amazonaws.com/${POOLID}/.well-known/jwks.json
它有相同类型的数据,但不会解码。相反,我最终会遇到如下错误:
Illegal base64 character 5f
因为这是一个下划线 _
并且在 Base64 URL 字母表中,我尝试将解码更改为:
Base64.getUrlDecoder().decode(encodedN.toByteArray())
但随后第一组数据无法正确解码,因为它包含 /
和其他 Base64 URL 编码的无效字符。
有没有一种方法可以用同一个解码器处理这两个 jwks
数据集?!?
注意: 这个问题是作者 ( Self-Answered Questions ) 有意编写和回答的,因此有趣问题的解决方案将在 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())
}
对于任何具有 Base64 解码的语言来说,这都是一个问题,因为它们可能会松散并忽略无效字符(有些会),或者它们可能会很严格并抛出异常。一些用于 Base64 编码/解码的测试网站也表现出这两种行为,静默忽略无效字符是危险的。稍后使用解码结果时会出现错误。
关于java - 使用 Amazon AWS Cognito `.well-known/jwks.json` 数据无法对某些字段进行 base64 解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39979842/
首先,我使用'DefaultResourceRetriever',没有任何这样的配置: new DefaultResourceRetriever(1000, 1000); 然后我得到了以下异常 jav
我正在阅读 JWKS 并找到有关 key 轮换概念的信息 - https://developer.okta.com/docs/concepts/key-rotation/ 假设我在我的应用程序中使用
我正在尝试配置 Istio 身份验证策略来验证我们的 JWT。 我设置了策略并可以看到它生效了。但是它不允许任何东西连接。应用该策略时,如果我检查 istio-pilot 日志,我会发现它无法检索签名
我收到两个 JWT:一个 OpenID Connect ID token (id_token) 和一个访问 token (access_token)。 OpenID 的情况或多或少很清楚 - 我可以使
我正在 AWS Cognito 上验证访问 token 。我必须做的一件事是将 key 从 jwks.json(用户池的)转换为 rsa 公钥结构(取决于使用的 JWT API)。 所以 'n' 和
我正在使用 Firebase 对我的应用中的用户进行身份验证。 Firebase 生成一个 JWT token ,我需要在我的服务器上进行身份验证。我使用 tyk.io 来做这件事。 Tyk 支持这些
我使用 Azure AD 控制台配置 JWT token 。一切看起来都很好并且能够检索 token ,但我发现 JWKS_url ( https://login.microsoftonline.co
我使用 Azure AD 控制台配置 JWT token 。一切看起来都很好并且能够检索 token ,但我发现 JWKS_url ( https://login.microsoftonline.co
我正在使用 dgrijalva/jwt-go 和 lestrrat-go/jwx。 我试图实现的是使用 jwks 验证 wso2 jwt。 token (过期 token ): const token
我正在设计使用 IdentityServer4 来保护多个服务的原型(prototype),但需要注意的是,这些服务可能不会被迁移(在可预见的将来)以使用 ASP.NET Core 的 OWIN 中间
我正在我的 Keycloak 实例中配置一个外部身份提供者,并尝试让它使用外部 JWKS URL 验证 token 。使用从 JWKS 转换后的 PEM 工作正常,使用 URL 无效。 登录时 tok
按照文档 here和 there ,我设法设置了一个授权服务器,它发出用非对称 key 签名的 JWT 访问 token ,资源服务器使用公钥的本地副本在本地验证这些 token 。到目前为止一切顺利
我对使用 OIDC 的后端 api 授权流程有点困惑。 我已将 SPA 应用程序与其余后端 api react 。 我想允许应用程序客户端注册他们自己的 OIDC 提供商以进行登录/注册。 OpenI
我有一些 key ID 可用于验证 token ,但它是硬编码的,我不希望它是这样。我正在使用 jwks-rsa 库从 API 端点获取 key 并打开 token 以进行验证,但是获取是在 jwks
假设您使用 AWS,并且想使用 Cognito 使用基于 ID 的身份验证。 然后 aws 为您提供一个公钥,您可以使用它来验证 cognito 负载。 我们还假设您不想或不能使用任何像 jose 这
我通过包装并通过 Azure API 管理对其进行缓存来为下面的发现端点设置缓存。 https://openid-connect-eu.onelogin.com/oidc/.well-known/op
当使用 Amazon AWS Cognito Federated Identities 并在以下位置解析数据时: https://cognito-identity.amazonaws.com/.wel
我正在尝试实现一项服务 (API),以履行资源服务器的 OAuth 角色。我们有一个实现隐式流程的 Angular 客户端应用程序。我们使用 GLUU 作为我们的 OpenID 提供者。客户端应用程序
我有: 身份服务器 4, 具有 OpenId Connect 和混合流的 Mvc 应用 WebApi 应用 假设用户已经获得带有 id_token 和访问 token 的 cookie。然后他从 mv
我有: 身份服务器 4, 具有 OpenId Connect 和混合流的 Mvc 应用 WebApi 应用 假设用户已经获得带有 id_token 和访问 token 的 cookie。然后他从 mv
我是一名优秀的程序员,十分优秀!