【问题标题】:How to invoke an API Gateway endpoint with IAM_AUTH without cognito如何在没有 cognito 的情况下使用 IAM_AUTH 调用 API Gateway 端点
【发布时间】:2021-05-26 03:27:22
【问题描述】:

我在 API 网关上有一个端点,我想用IAM_AUTH 调用来保护它。我正在使用aws-4axios 来生成 AWSv4 签名。

export default class API {
  stage = (process.env.REACT_APP_STAGE || 'dev').toUpperCase();
  client: AxiosInstance;

  constructor(accessKey: string, secretKey: string) {
    const interceptor = aws4Interceptor(
      {
        region: 'us-east-1',
        service: 'execute-api',
      },
      {
        accessKeyId: accessKey,
        secretAccessKey: secretKey,
      },
    );
    this.client = axios.create();
    this.client.interceptors.request.use(interceptor);
  }

  public async createSetupIntent(customer_id: string): Promise<void> {
    const response = await this.client.post(
      `${process.env[`REACT_APP_API_ENDPOINT_${this.stage}`]}/${CREATE_SETUP_INTENT_ENDPOINT}`,
      JSON.stringify({ customer_id }),
    );
    console.log(response);
  }
}

我遇到的问题是我在浏览器中执行此客户端,chrome 抛出一个错误,设置 API Gateway requires 的 Host 标头,这反过来又导致 API Gateway 返回 403 响应。

拒绝设置不安全的标头“主机”

我猜这是为了防止我正在尝试做的事情 - 使用访问/密钥客户端。

我从客户端而不是服务器端执行此操作并且没有 cognito 的原因是因为最终这些请求将在服务器上完成。这只是在我们与其他服务器集成之前,在开发应用程序的其他方面时使用的虚拟/概念证明/临时解决方案。

是否可以在没有 cognito 的情况下从浏览器调用 IAM_AUTH 端点?

【问题讨论】:

    标签: typescript http axios aws-api-gateway


    【解决方案1】:

    您确实需要发送主机标头,但浏览器实际上会为您执行此操作 - 它会自动设置主机标头以匹配 URL 中的主机名,这可能是您想要的(这似乎就是 @ 987654325@ 无论如何都在its implementation 做)。

    浏览器只是在抱怨,因为您试图覆盖它,但您不需要这样做,您实际上只是在使用默认值。

    这里描述的问题似乎不是由于 IAM API,它看起来只是 aws4-axios 的问题,它只设计用于节点(它在内部使用 aws4,这是明确的仅节点)。

    我建议您放弃它,并自己构建请求,通过调整 their code 来计算相同的签名,然后只需设置所需的 Authorization 和可能的 x-amz-date 标头,而不是尝试重置一切。

    或者,您可能对 aws4fetch 感兴趣,它可以在浏览器中为您完成这一切,但仅限于 Fetch,而不是 Axios。

    【讨论】:

      猜你喜欢
      • 2022-11-15
      • 2015-06-20
      • 2016-08-24
      • 2021-06-16
      • 2020-04-24
      • 1970-01-01
      • 2021-04-25
      • 2020-10-01
      • 2017-09-07
      相关资源
      最近更新 更多