【问题标题】:AWS API Gateway: Can't use CORS and API Key authentication together?AWS API Gateway:不能同时使用 CORS 和 API Key 身份验证?
【发布时间】:2021-02-06 15:13:14
【问题描述】:

我正在使用 AWS SAM 创建一些由 API-Gateway 事件触发的 Lambda 函数。

总的来说,它可以工作,但我需要添加两个功能:CORS 和 API 密钥身份验证。

我已经能够设置它,以便调用 API 需要 API 密钥。

这是我的template.yamlGlobals 部分:

Globals:
  Api:
    Auth:
      ApiKeyRequired: true

这很好用。

我还可以对其进行设置,使其支持 CORS。

这是Resources/Api 部分我的template.yaml

Resources:
  MyApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod
      Cors:
        AllowMethods: "'*'"
        AllowHeaders: "'*'"
        AllowOrigin: "'*'"
        AllowCredentials: "'*'"

但是,它只有在我一个或另一个时才有效。

换句话说,如果我两者都

Globals:
  Api:
    Auth:
      ApiKeyRequired: true
Resources:
  MyApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod
      Cors:
        AllowMethods: "'*'"
        AllowHeaders: "'*'"
        AllowOrigin: "'*'"
        AllowCredentials: "'*'"

...它停止工作。

具体来说,sam CLI 工具构建和部署 sam 应用程序;但是,如果我在浏览器中调用 API,请求会失败:

这里是具体的错误信息:

Access to XMLHttpRequest at 'https://75hkwcgiy.execute-api.us-east-1.amazonaws.com/Prod/plans/35580' from origin 'http://[mydomain].com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

GET https://75hkwcgiy.execute-api.us-east-1.amazonaws.com/Prod/plans/35580 net::ERR_FAILED

关于为什么会这样,以及如何解决它以便我可以同时支持 CORS 和 API 密钥身份验证的任何见解?

【问题讨论】:

  • 错误码和状态码是什么?
  • @PubuduJayawardana 错误是Access to XMLHttpRequest at 'https://75hkwcgiy.execute-api.us-east-1.amazonaws.com/Prod/plans/35580' from origin 'http://[mydomain].com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

标签: amazon-web-services aws-lambda aws-api-gateway aws-serverless


【解决方案1】:

AllowCredentials 不应该是true吗?

【讨论】:

  • 你可能是对的。但是,如果我设置AllowCredentials: true,则会收到错误消息:Unable to add Cors configuration because 'AllowCredentials' can not be true when 'AllowOrigin' is "'*'" or not set
  • @mattstuehler 你不能在AllowOrigin 中使用通配符*,而AllowCredentials: true。您需要明确设置来源。
【解决方案2】:

它在 ApiKeyRequired 为 true 且 CORS 开启时失败的原因是 ApiKeyRequired 将 api key required 属性添加到所有选项调用中,这导致预检失败,因为在选项调用中具有身份验证详细信息不是标准的。

如果您尝试在 swagger/openapi 模板中定义所有集成,我没有解决此问题的解决方案。

您可以通过使用 lambda 中的事件定义集成并指定应启用 api 密钥的方法来解决此问题,然后从网关中删除 ApiKeyRequired。

在你的 lambda 上有

Events:
    HttpGet:
      Type: Api 
      Properties:
        Path: "/jobs"
        Method: GET
        RestApiId: !Ref ApiGateway
        Auth:
          ApiKeyRequired: True

【讨论】:

    【解决方案3】:

    您提到“如果我在浏览器中调用 API” 它会产生错误。

    错误源于浏览器实施的称为同源策略的安全机制。 See David Katz's Medium post.

    Katz 提供了有关错误、其原因和一些解决方案选项的更详细信息。其中包括使用浏览器插件或代理服务器(您的或其他人的)。

    【讨论】:

    • 感谢您的回复。但我不确定这一点。我在上面使用的 API 规范应该专门使该 API 能够接受 CORS 请求。
    • 我认为您的 API 配置与浏览器的安全行为没有任何关系。
    猜你喜欢
    • 2016-08-20
    • 1970-01-01
    • 2019-12-14
    • 2016-01-09
    • 2020-03-27
    • 2020-01-05
    • 2018-01-09
    • 2019-11-18
    • 2018-07-20
    相关资源
    最近更新 更多