gpt4 book ai didi

amazon-web-services - 如何使用 OpenAPI 为 AWS API Gateway 配置 CORS?

转载 作者:行者123 更新时间:2023-12-05 00:45:51 24 4
gpt4 key购买 nike

我有一个 API 的 OpenAPI 规范,我正在通过 CDK 部署它。规范如下:

openapi: 3.0.1
info:
title: My API
description: My REST API with CORS enabled
version: 0.1.0

x-amazon-apigateway-cors:
allowOrigins:
- "*"
allowCredentials: true
exposeHeaders:
- "x-apigateway-header"
- "x-amz-date"
- "content-type"
maxAge: 3600
allowMethods:
- "*"
allowHeaders":
- "x-apigateway-header"
- "x-amz-date"
- "content-type"
- "Authorization"

components:
securitySchemes:
lambda:
type: "apiKey"
name: "Authorization"
in: "header"
x-amazon-apigateway-authtype: "custom"
x-amazon-apigateway-authorizer:
authorizerUri: "{{my-lambda-authorizer}}"
authorizerResultTtlInSeconds: 300
type: "token"

paths:
/user/{id}:
get:
summary: Get info of specified user.
parameters:
- in: path
name: id
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/User'
security:
- lambda: []
x-amazon-apigateway-integration:
uri: "{{my-lambda}}"
passthroughBehavior: "when_no_match"
httpMethod: "POST"
type: "aws_proxy"

当我尝试通过 fetch() 访问此内容时,出现错误 无法加载资源:Access-Control-Allow 不允许 Origin http://localhost:8000 -起源

fetch('https://api.example.com/user/1')
.then(response => response.json())
.then((user: User) => {
// do something
})
.catch((err) => {
console.log("Error: " + err);
});

可以通过 api.example.com 访问该 API,并且我使用 Gatsby 在 localhost:8000 本地运行该网站。

AWS docs似乎表明,当我将 x-amazon-apigateway-cors 放在规范的根目录时,CORS 已启用,但当我尝试访问该规范时,CORS 似乎并未启用(或工作) API。如何为我的 API 启用 CORS,而无需在控制台中进行配置?

最佳答案

Amazon API Gateway 提供两种类型的 API:REST API 和 HTTP API。 REST API 是最初随 Amazon API Gateway 引入的 API 类型,而 HTTP APIs got announced at the end of 2019 .

根据您的 OpenAPI 规范的描述,我假设您正在尝试部署 REST API。然而,x-amazon-apigateway-cors OpenAPI 扩展仅适用于 HTTP API。

您现在有两个选择:要么切换到使用 HTTP API,要么手动配置 CORS。只要你不需要features only supported by REST APIs ,我建议您改用 HTTP API,因为这是 Amazon API Gateway 提供的更现代的 API。

如果您想使用 REST API,启用 CORS 需要更多手动配置。 AWS 在 Enabling CORS for a REST API resource 中记录了这一点。本质上,您必须确保集成返回正确的 CORS header 。对于 NodeJS AWS Lambda 函数,可能如下所示:

exports.handler = async (event) => {
const response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Headers" : "Content-Type",
"Access-Control-Allow-Origin": "https://www.example.com",
"Access-Control-Allow-Methods": "OPTIONS,POST,GET"
},
body: JSON.stringify('Hello from Lambda!'),
};
return response;
};

要使 CORS 飞行前请求正常工作,您还必须确保 OPTIONS 请求也返回正确的 header 。实现这一目标的最简单方法是将 OPTIONS 请求的模拟集成添加到您的 OpenAPI 规范中。看起来像:

options:
responses:
'200':
description: Default response
headers:
Access-Control-Allow-Headers:
schema:
type: string
Access-Control-Allow-Methods:
schema:
type: string
Access-Control-Allow-Origin:
schema:
type: string
x-amazon-apigateway-integration:
type: mock
requestTemplates:
application/json: |
{"statusCode" : 200}
responses:
default:
statusCode: 200
responseParameters:
method.response.header.Access-Control-Allow-Headers: "'*'"
method.response.header.Access-Control-Allow-Methods: "'OPTIONS,POST'"
method.response.header.Access-Control-Allow-Origin: "'https://example.com/'"

另请注意 modern browsers don't support localhost as origin for CORS ,所以您可能也需要解决这个问题。

关于amazon-web-services - 如何使用 OpenAPI 为 AWS API Gateway 配置 CORS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62730683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com