Amazon web services API网关选项方法403
我有一个带有API网关的Amazon web services API网关选项方法403,amazon-web-services,aws-lambda,aws-api-gateway,aws-sam,Amazon Web Services,Aws Lambda,Aws Api Gateway,Aws Sam,我有一个带有API网关的自定义授权程序。当通过SAM模块部署时在启用CORS时也会创建Options方法。我真的不明白的是,为什么自定义授权人会附加到Optionsendpoint 当我尝试从浏览器调用端点时抛出403,当我从Options方法中删除Authorization时,它工作得非常好 下面是模板。yaml AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Globals:
自定义授权程序
。当通过SAM模块部署时
在启用CORS
时也会创建Options方法
。我真的不明白的是,为什么自定义授权人会附加到Options
endpoint
当我尝试从浏览器调用端点时抛出403
,当我从Options
方法中删除Authorization
时,它工作得非常好
下面是模板。yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Globals:
Function:
Runtime: nodejs8.10
Api:
Cors:
AllowMethods: "'*'"
AllowHeaders: "'*'"
AllowOrigin: "'*'"
Resources:
TestApi:
Type: AWS::Serverless::Api
Properties:
StageName: dev
Auth:
DefaultAuthorizer: testAuthoriser
Authorizers:
testAuthoriser:
FunctionArn:
Fn::ImportValue: !Sub test-custom-autoriser
Identity:
Header: Authorization
ValidationExpression: ^Bearer [-0-9a-zA-Z\._]*$
ReauthorizeEvery: 30
Version:
Type: 'AWS::Serverless::Function'
Properties:
FunctionName: test
CodeUri: src/test
Handler: index.test
Events:
EndPoint:
Type: Api
Properties:
RestApiId: !Ref TestApi
Path: /test
Method: get
Auth:
Authorizer: testAuthoriser
我也在标题中启用了
“Access-Control-Allow-Origin”:“*”
。不知道这里发生了什么。任何帮助都将不胜感激对于CORS,AWS API网关将始终启用允许飞行前测试的选项方法。你可以在网站上阅读更多关于这方面的内容
您在浏览器中看到飞行前错误的原因是403 Forbidden来自您的自定义授权人。自定义授权器不返回标题,所以若自定义授权器拒绝请求,您将始终看到飞行前错误
要对此进行调试,请记录自定义授权人返回的策略。你可以在CloudWatch中看到这一点。策略必须包含所请求资源的Allow语句。答案如下,请参阅aws sam问题
Api:
Cors:
AllowHeaders:“'Access-Control-Allow-Headers,Origin,Accept,X-Request-With,内容类型,访问控制请求方法,访问控制请求头,授权'”
AllowOrigin:“'*'”
认证:
默认授权人:认知授权人
授权人:
认知授权人:
UserPoolArn:yourUserPool
AddDefaultAuthorizartoCorsPreflight:False//Policy确实包含Allow语句-{“principalId”:“,”policyDocument:{“Version”:“2012-10-17”,“语句”:[{“Action”:“execute api:Invoke”,“Effect”:“Allow”,“Resource”:“arn:RemaingArn”}],“context”:{“scope”:“aws.cognito.sign.user.admin”}
如前所述,如果从选项中删除授权,则一切正常。我建议使用用户ID填充principalId
。也不确定为什么策略中有上下文,因为从自定义授权人的角度来看,它没有任何用途。请尝试删除它。最后确保remainran
与使用实际资源。您可以尝试使用通配符进行测试。arn:aws:execute api:::::::://code>我尝试了上述建议,但遇到了相同的问题。我相信是它的api网关导致了问题。与此类似https://github.com/auth0-samples/jwt-rsa-aws-custom-authorizer
嘿,你找到如何删除身份验证了吗Options
方法中的rizer?这是正确的答案。如果您正在设置DefaultAuthorizer并同时使用Cors属性,则Cors飞行前API的Options方法将使用该默认授权器。您可能不希望这样做,因为您的浏览器可能无法正确处理这些调用的授权o选项。请参阅