如何在不设置 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 response
和 invalid mapping expression specified
为 POST
。如何跳过http_proxy
进行上述设置?似乎一旦我在路径上配置,它就适用于 OPTION 和 POST。以上是关于如何在不设置 lambda 的情况下在 apigateway http_proxy 上添加 CORS?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不设置密码的情况下在防火墙后面使用 Gradle,只是一个用户?
Kendo DataSource:如何在不发送两个 httprequest 的情况下在 fetch 之前设置过滤器
如何在不使用 AudioQueueRef 的情况下在 AudioQueue 中设置音量?
您好,我是 Flutter 新手,仍在练习基础知识。我想学习如何在不使用 firebase auth 的情况下在登录页面上设置默认凭据