我已经通过Cognito用户池连接了OIDC身份提供程序(SalesForce),并通过this guide或多或少设置了ALB内置身份验证。
通过此设置,我的Web应用程序(基于Java/Spring Boot)将接收ALB转发的 header x-amzn-oidc-accesstoken
,x-amzn-oidc-identity
和x-amzn-oidc-data
。
我可以解析和验证这些 header 中包含的JWT token ,例如,从那里获取用户的电子邮件。
现在,我的目标是使经过身份验证的用户可以直接从客户端通过AWS JavaScript SDK访问某些AWS资源或服务。例如,我希望用户能够列出S3存储桶上的对象或调用某些lambda函数。
我的理解是,我需要以某种方式为该经过身份验证的用户生成时间凭证。但是我找不到有关如何执行此操作的特定文档。最接近的命中是:
但是我无法将那里的点连接起来。我的期望是我可能应该以某种方式使用
x-amzn-oidc-accesstoken
,x-amzn-oidc-identity
和x-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)
},
...
重要的部分是
AccessKeyId
,SecretAccessKey
和SessionToken
。这些临时凭证可用于直接从代码中调用S3,Lambda或任何其他AWS服务,但是您将需要配置当前用于包含它们的SDK。完成所有这些操作后,您应该会很好,没有任何问题。
关于amazon-web-services - 使用AWS ALB/Cognito/OIDC IdProvider进行身份验证后如何获取临时凭证?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56950726/