我已经通过Cognito用户池连接了OIDC身份提供程序(SalesForce),并通过this guide或多或少设置了ALB内置身份验证。

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

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

我的理解是,我需要以某种方式为该经过身份验证的用户生成时间凭证。但是我找不到有关如何执行此操作的特定文档。最接近的命中是:

  • https://docs.aws.amazon.com/AmazonS3/latest/dev/AuthUsingTempFederationTokenJava.html
  • https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-credentials-browser.html

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

    因此,我的问题是:如何为用户生成临时凭证,该凭证已通过OIDC身份提供程序通过Cognito通过内置ALB身份验证进行了身份验证?

    最佳答案

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

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

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

  • RoleArn-以上创建的角色的知识,您的用户将使用
  • RoleSessionName- session 用户的名称(可以是任意字符串)
  • WebIdentityToken-符合OIDC的 token (您当前拥有的 token )
  • Duration-返回的凭据将有效多长时间

  • 拨打电话后,您将收到包含以下内容的响应:
    'Credentials': {
        'AccessKeyId': 'string',
        'SecretAccessKey': 'string',
        'SessionToken': 'string',
        'Expiration': datetime(2015, 1, 1)
    },
    ...
    

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

    关于amazon-web-services - 使用AWS ALB/Cognito/OIDC IdProvider进行身份验证后如何获取临时凭证?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56950726/

    10-09 02:37