如何在不设置 lambda 的情况下在 apigateway http_proxy 上添加 CORS?

Posted

技术标签:

【中文标题】如何在不设置 lambda 的情况下在 apigateway http_proxy 上添加 CORS?【英文标题】:How can I add CORS on apigateway http_proxy without setting a lambda? 【发布时间】:2021-08-06 07:09:35 【问题描述】:

我有一个 API 网关,并且在网关中定义了一些路径。我想将 CORS 启用到作为 http_proxy 指向后端 appsync 的路径之一。 appsync 解析器指向 dynamodb 表。所以前端调用API网关将请求传递给appsync,请求由dynamodb解析。

我的问题是在该特定路径上启用 CORS。但是基于这个文档:https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html 它说我必须响应后端的 CORS 标头,它是一个 lambda。但我在后端没有 lambda。所有的后端都只是 appsync + 一些解析器(例如 Dynamodb)。如何让它支持 CORS?

当我直接调用 appsync 端点时,它会响应 access-control-allow-origin: * 并且它适用于前端(网站)。但是,如果前端调用 API 网关域,它会因为 cors 而被拒绝。我相信 apigateway 不允许 CORS,那么如何在没有后端 lambda 的情况下在 http_proxy 集成中启用 cors?

【问题讨论】:

你关注这些docs了吗?他们对 lambda 只字未提。 它只适用于不Lambda or HTTP proxy integrations。您可以查看我的问题中的文档并移至底部 所以你已经知道你的答案了。可能您的 appsync 后端必须实现完全的 cors 处理。 对,问题是我的 appsync 后端没有任何源代码。它只是 dynamodb,所以我正在寻找解决方案。 【参考方案1】:

假设您有以下CloudFormation 声明,用于基于HTTP_PROXY 集成的GraphQL POST 方法

GraphQLPostMethod:
    Type: AWS::ApiGateway::Method
    Properties:
      HttpMethod: POST
      Rest of the properties for HTTP_PROXY integration

OPTIONS 请求再定义一种方法。如果源(即AppSync)使用适当的标头响应选项请求,您应该可以使用HTTP_PROXY 集成。如果没有,或者您不想将 Options 请求发送到 AppSync,在这种情况下,您可以将 MOCK 集成用于 Options 方法。

GraphQLOptionsMethod:
    Type: AWS::ApiGateway::Method
    Properties:
      AuthorizationType: NONE
      HttpMethod: OPTIONS
      ResourceId: !Ref <ReplaceWithYourResrouce>
      RestApiId: !Ref <ReplaceWithYourAPI>
      MethodResponses:
        - ResponseModels:
            application/json: Empty
          ResponseParameters:
            method.response.header.Access-Control-Allow-Headers: true
            method.response.header.Access-Control-Allow-Methods: true
            method.response.header.Access-Control-Allow-Origin: true
          StatusCode: '200'
      Integration:
        Type: MOCK
        IntegrationResponses:
          - ResponseTemplates:
              application/json: ''
            StatusCode: '200'
            ResponseParameters:
              method.response.header.Access-Control-Allow-Headers: "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'"
              method.response.header.Access-Control-Allow-Methods: "'POST'"
              method.response.header.Access-Control-Allow-Origin: !Sub "'$ReplaceWithYourCORSAllowedOrigin' or hardcode to *"
        PassthroughBehavior: NEVER
        RequestTemplates:
          application/json: '"statusCode": 200'

【讨论】:

感谢您的回复。为什么你为MethodResponses下的响应参数设置true,但在integrationReponses中设置实际值? docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/… 第一个说它是必需的,在 MOCK 响应中,您发送的是实际值。 谢谢。为什么在值中放三个单引号''' 更新了引号 我的路径现在有两种方法,POST 是一个 http_proxy,OPTIONS 是一个模拟。当我启用 cors 时,它显示 invalid status code in responseinvalid mapping expression specifiedPOST。如何跳过http_proxy 进行上述设置?似乎一旦我在路径上配置,它就适用于 OPTION 和 POST。

以上是关于如何在不设置 lambda 的情况下在 apigateway http_proxy 上添加 CORS?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不设置密码的情况下在防火墙后面使用 Gradle,只是一个用户?

Kendo DataSource:如何在不发送两个 httprequest 的情况下在 fetch 之前设置过滤器

如何在不使用 AudioQueueRef 的情况下在 AudioQueue 中设置音量?

如何在不通过 Web 调用的情况下在浏览器中查找地理位置

您好,我是 Flutter 新手,仍在练习基础知识。我想学习如何在不使用 firebase auth 的情况下在登录页面上设置默认凭据

如何在不堆叠回调的情况下在 jQuery 中制作动画?