在使用AWS ALB / Cognito / OIDC IdProvider进行身份验证后,如何获取临时凭证?

时间:2019-07-09 10:39:14

标签: amazon-web-services amazon-cognito oidc

我通过this guide之后或多或少地与通过Cognito用户池连接的OIDC身份提供商(SalesForce)建立了ALB内置身份验证。

通过此设置,我的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标头,但是我找不到能做到这一点的任何代码。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

重要的部分是AccessKeyIdSecretAccessKeySessionToken。这些  临时凭证可用于直接从代码中调用S3,Lambda或任何其他AWS服务,但是您将需要配置当前用于包含它们的SDK。完成所有这些操作之后,您应该会很好,没有任何问题。