Cors 飞行前响应403禁止。如果没有x-api-key,我如何允许选项方法?
我正在使用SAM在cloudformation中创建API 我在我的options方法上得到了一个403禁忌(因此也是我的get方法的飞行前) 在没有x-api-key的情况下,如何允许我的options方法回复200 OK 我尝试了这么多的stackoverflow答案,但没有一个符合我的SAM模板格式。我已经尝试了所有不同的Alloweader组合。我已经输入了x-api-key,仍然是403禁止的 如果我将我的x-api-key和我的请求一起发送给postman,我会得到一个200 OK,但在我的reactjs应用程序中,它仍然会给出与下面相同的错误,我的飞行前没有通过 对get方法的控制台日志响应 邮递员对选项方法的回应(飞行前测试) Cloudwatch错误 模板yamlCors 飞行前响应403禁止。如果没有x-api-key,我如何允许选项方法?,cors,amazon-cloudformation,aws-api-gateway,preflight,sam,Cors,Amazon Cloudformation,Aws Api Gateway,Preflight,Sam,我正在使用SAM在cloudformation中创建API 我在我的options方法上得到了一个403禁忌(因此也是我的get方法的飞行前) 在没有x-api-key的情况下,如何允许我的options方法回复200 OK 我尝试了这么多的stackoverflow答案,但没有一个符合我的SAM模板格式。我已经尝试了所有不同的Alloweader组合。我已经输入了x-api-key,仍然是403禁止的 如果我将我的x-api-key和我的请求一起发送给postman,我会得到一个200 OK,
Globals:
Function:
Timeout: 10
Api:
Cors:
AllowMethods: "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
AllowHeaders: "'Content-Type,X-Amz-Date,X-Amz-Security-Token,x-api-key,Authorization,Origin,Host,X-Requested-With,Accept,Access-Control-Allow-Methods,Access-Control-Allow-Origin,Access-Control-Allow-Headers'"
AllowOrigin: "'*'"
Resources:
BSApi:
Type: AWS::Serverless::Api
Properties:
StageName: Prod
Auth:
ApiKeyRequired: true
AddDefaultAuthorizerToCorsPreflight: false
GrondvogFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: grondvog/
Handler: app.lambdaHandler
Runtime: nodejs12.x
Policies:
- LambdaInvokePolicy: {
'FunctionName': !Ref RDBQueryFunction
}
Environment:
Variables:
"RDBQueryFunctionName": !Ref RDBQueryFunction
Events:
KryGrondvog:
Type: Api
Properties:
RestApiId: !Ref BSApi
Path: /grondvog
Method: get
OptionsGrondvog:
Type: Api
Properties:
RestApiId: !Ref BSApi
Path: /grondvog
Method: options
Lambda函数
if (event.httpMethod == 'OPTIONS') {
rekords = {
statusCode: 200,
headers: {
"Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,X-Amz-Security-Token,x-api-key,Authorization,Origin,Host,X-Requested-With,Accept,Access-Control-Allow-Methods,Access-Control-Allow-Origin,Access-Control-Allow-Headers",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT",
"X-Requested-With": "*"
},
body: JSON.stringify({ statusText: "OK" })
};
}
好的,我找到了解决办法 我错过了应该告诉我的SAM应用程序,对于options方法,我必须指定我不想要api密钥的部分。我刚刚在每个选项方法中添加了以下内容:
Auth:
ApiKeyRequired: false
嘿,我遇到了同样的问题,我的选项请求需要API密钥。但是我并没有显式地声明我的选项,而是让AWS SAM添加它,因为在我的情况下,当用户发出选项请求时,我没有调用函数。你知道我如何允许API键不被调用吗required@SGolds你找到解决办法了吗?我也有同样的案子。我没有在sam模板中指定选项和方法,但是浏览器发出这些请求,并且响应为错误:x-amzn-errortype:MissingAuthenticationTokenExceptionHi,是的,我实际上从api资源中删除了身份验证,然后直接在需要密钥的GET路径上添加了身份验证。(您的设置可能不同,但我通过向lambda函数添加api事件来添加api资源,所以我只是向这些部分添加了auth,而不是api)
GrondvogFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: grondvog/
Handler: app.lambdaHandler
Runtime: nodejs12.x
Policies:
- LambdaInvokePolicy: {
'FunctionName': !Ref RDBQueryFunction
}
Environment:
Variables:
"RDBQueryFunctionName": !Ref RDBQueryFunction
Events:
KryGrondvog:
Type: Api
Properties:
RestApiId: !Ref BSApi
Path: /grondvog
Method: get
OptionsGrondvog:
Type: Api
Properties:
RestApiId: !Ref BSApi
Path: /grondvog
Method: options
Auth:
ApiKeyRequired: false