【问题标题】:How to get temporal credentials after auth with AWS ALB/Cognito/OIDC IdProvider?如何在使用 AWS ALB/Cognito/OIDC IdProvider 进行身份验证后获取临时凭证?
【发布时间】:2019-11-18 21:38:30
【问题描述】:

我已经使用通过 Cognito 用户池连接的 OIDC 身份提供商 (SalesForce) 设置 ALB 内置身份验证,或多或少遵循 this guide

通过此设置,我的 Web 应用程序(基于 Java/Spring Boot)接收由 ALB 转发的标头 x-amzn-oidc-accesstokenx-amzn-oidc-identityx-amzn-oidc-data
我可以解析和验证这些标头中包含的 JWT 令牌,例如,从那里获取用户的电子邮件。

现在我的目标是让经过身份验证的用户通过 AWS JavaScript SDK 直接从客户端访问某些 AWS 资源或服务。例如,我希望用户能够列出 S3 存储桶上的对象或调用某些 lambda 函数。

我的理解是,我需要为这个经过身份验证的用户生成临时凭据。但我找不到有关如何执行此操作的具体文档。最接近的命中是:

但我无法将那里的点连接起来。我的期望是我可能应该以某种方式使用x-amzn-oidc-accesstokenx-amzn-oidc-identityx-amzn-oidc-data 标头,但我找不到任何可以做到这一点的代码。

所以我的问题是:如何为通过 Cognito 与 OIDC 身份提供程序通过内置 ALB 身份验证进行身份验证的用户生成临时凭据?

【问题讨论】:

  • 您是否尝试过 Cognito 服务提供者框架?它们直接通过 SDK 公开 AWS 服务,并包括“凭证提供商与 Amazon Cognito 通信,检索经过身份验证和未经身份验证的用户的唯一标识符以及 AWS 移动 SDK 的临时、有限特权 AWS 凭证。检索到的凭证对一个人有效小时,提供商会在它们过期时刷新它们。” docs.aws.amazon.com/cognito/latest/developerguide/…
  • @lasleyd 这意味着“一旦 Amazon Cognito 凭证提供程序被初始化和刷新”。而且我找不到如何为此使用x-amzn-oidc- 标头。
  • Cognito 文档在这种情况下并不直观。您是否已经浏览过本节 (docs.aws.amazon.com/cognito/latest/developerguide/…) 并且浏览过任何提供程序示例:aws-amplify.github.io/aws-sdk-android/docs/reference/com/…
  • @lasleyd 是的,我看到了这些文档。我可以从 x-amzn-oidc-accesstokenx-amzn-oidc-data 验证 JWT 令牌,但我仍然不知道如何使用这些令牌创建临时凭证。
  • 好的,既然您使用的是 Java/Spring,那么您是否定义了此处所述的 JWT 处理器? gorillalogic.com/blog/java-integration-with-amazon-cognito 这将使访问和操作令牌变得更加容易。 Nimbus JOSE 上的文档更详细地解释了解析选项/功能:connect2id.com/products/nimbus-jose-jwt

标签: amazon-web-services amazon-cognito openid-connect


【解决方案1】:

您需要采取多个步骤来实现这一目标。

首先是创建一个适当的 IAM 角色,让您的用户代入该角色。如果您想为您的用户提供 S3 访问,那么您需要以这种方式定制 IAM 角色并设置该角色和WebIdentity 之间的信任关系(如果您转到控制台 -> IAM -> 角色 -> 创建角色,您将在屏幕顶部看到此选项 - Select type of trusted entity 并根据您的实际 OIDC 提供商配置提供商。

拥有该角色后,您需要将您当前拥有的 WebIdentity 令牌交换为 STS 令牌。在您的情况下,您需要调用 sts.assume_role_with_web_identity 函数(它是 SDK 的一部分),您需要在其中指定

  • RoleArn - 上面创建的角色的 arn,将由您的用户承担
  • RoleSessionName - 会话用户的名称(可以是任意字符串)
  • WebIdentityToken - 符合 OIDC 的令牌(您当前拥有的令牌)
  • Duration - 返回的凭据有效期为多长时间

拨打电话后,您将收到包含以下内容的回复:

'Credentials': {
    'AccessKeyId': 'string',
    'SecretAccessKey': 'string',
    'SessionToken': 'string',
    'Expiration': datetime(2015, 1, 1)
},
...

重要的部分是AccessKeyIdSecretAccessKeySessionToken。这些 临时凭证可用于从您的代码直接调用 S3、Lambda 或任何其他 AWS 服务,但您需要配置您当前使用的开发工具包以包含它们。一旦完成所有这些,你应该很高兴没有任何问题。

【讨论】:

  • 您说“WebIdentityToken - 符合 OIDC 的令牌(您目前拥有的那个)” - 它是哪一个?是 x-amzn-oidc-identity 标头包含的内容吗?
  • 我不确定这些标头中的哪一个存储了实际的令牌,它是 x-amzn-oidc-accesstokenx-amzn-oidc-data
  • 我收到 “提供的 ID 令牌不是有效的 JWT。(如果您发送了访问令牌,您可能会看到此错误)” 如果我发送 X-Amzn-Oidc-Data。如果我发送X-Amzn-Oidc-Accesstoken,我会收到“缺少必需的声明:aud”x-amzn-oidc-identity 也不起作用(不是有效的 JWT)。
  • 似乎 ALB 正在以某种方式修改令牌。我将研究如何根据从 ALB 收到的数据重建令牌。
  • X_AMZN_OIDC_DATA 的示例我正在尝试使用:pastebin.com/HXeL01w2 很高兴被jwt.io 解码。
猜你喜欢
  • 2022-01-26
  • 2021-01-05
  • 2023-02-16
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
  • 2021-04-28
  • 2019-06-19
相关资源
最近更新 更多