【问题标题】:sign request to AWS API gateway with Signature v4 from using AWS Cognito token使用 AWS Cognito 令牌通过 Signature v4 对 AWS API 网关的请求进行签名
【发布时间】:2020-06-23 12:21:53
【问题描述】:

我创建了一个 AWS API Gateway 集,其身份验证 = AWS_IAM 来调用 Lambda 函数。现在,要调用此 API,我知道我需要对请求进行签名,并且如 AWS 文档中所述,正确的方法是添加使用 AWS Signature V4 计算的 Authorization 标头,该标头需要 access_key 和 secret_key。 在我的客户端,用户首先使用 AWS Cognito 进行身份验证并接收 JWT 令牌(id 令牌访问令牌和刷新令牌),但我找不到 access_key/secret _key 在其中。如何根据从 AWS Cognito 收到的令牌计算 AWS Signature V4?

【问题讨论】:

    标签: aws-api-gateway amazon-cognito


    【解决方案1】:

    我相信你不能(肯定有 99,99999)!

    请确认您正在使用 AWS Cognito 用户池对您的用户进行身份验证。您可能是因为 Cognito 用户池是提供 JWT 的服务。在这种情况下,令牌将确保接收它的服务(API 网关)您的用户已在特定身份目录(用户池)中注册。您的服务应评估它是否会为在此特定目录中注册的用户提供对其资源的访问权,并提供声明(组、角色等)。

    当您使用 AWS_IAM 保护您的 API Gateway 端点时,您是说只有 AWS 可以在其自己的身份目录(用户或角色)中识别的身份才能对资源执行操作。一般来说,在 Cognito 用户池中注册的用户不会被 AWS 视为有效身份。

    要将 Cognito 用户池用户视为有效的 AWS 身份,您有两种选择:

    1 - 将您的 AWS 账户配置为使用外部 Identity Providers and Federation。这不是一件简单的事情,而是针对不同用例的解决方案。综上,不要选这个。

    2 - 使用另一个名为 Cognito Identity Pool 的 AWS 产品(名称容易引起混淆)。此服务评估该上下文中是否允许 JWT 令牌(您在身份池中对其进行配置)。如果是来自已注册身份目录的有效令牌,Cognito 身份池会将您的 JWT 令牌交换为与特定 IAM 角色关联的 AWS 访问密钥、AWS 密钥和 AWS 会话令牌。然后,您可以使用这些密钥签署您的请求。但请记住,通过此更改,您将失去在 API Gateway 和 API Gateway 调用的下游服务中识别特定用户的能力。 如果您需要在下游服务中包含 JWT 令牌,则可以通过一些额外的努力来完成。你在这里找不到方法:https://stackoverflow.com/a/57961207/6471284

    【讨论】:

    • 感谢您的回复。我实际上正在使用身份提供程序。我现在可以使用 AWS Amplify 对 API 调用进行身份验证。现在我想知道是否有一种方法可以从将访问令牌存储在会话中的后端(PHP)调用其余 API。因此,用户在客户端站点上进行身份验证,获取令牌,将令牌发送到后端,将其存储到会话中,并在加载新页面时使用它来调用 REST API(假设会话仍然存在)。跨度>
    • 您可能可以在放大中内省您的本地存储并获取令牌。但我相信在你的情况下它是不需要的。也许我没有正确理解您的用例,但是如果您已经在后端,假设您的后端在 AWS 内部,因为它由 API Gateway 中的 IAM 保护,您可以查询您的后端环境并获取执行的凭证角色。如果您使用的是 Aws Lambda,则可以在 AWS_ACCESS_KEY 或 AWS_SECRET_ACCESS_KEY 环境变量中找到。它们也可用于 EC2 和 ECS。可能也在 Fargate。
    猜你喜欢
    • 2019-09-03
    • 2019-01-15
    • 2020-06-12
    • 2017-11-23
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2021-04-24
    • 2018-07-24
    相关资源
    最近更新 更多