API Gateway Options方法返回403:自定义授权器绑定问题求助
解决API Gateway自动生成的OPTIONS方法绑定自定义授权器导致的403问题
我完全懂你遇到的麻烦——用SAM部署带自定义授权器的API并启用CORS时,自动生成的OPTIONS预检请求被强制绑定了授权器,可浏览器发起的OPTIONS请求本来就不会带Authorization头,直接触发403太闹心了。
问题根源
SAM在你配置DefaultAuthorizer时,默认会把这个授权器应用到所有API方法上,包括为CORS自动创建的OPTIONS方法。但按照CORS规范,预检请求(OPTIONS)的作用只是确认服务器是否允许后续跨域请求,不需要携带身份凭证,所以授权器会直接拒绝这类无授权头的请求。
解决方案:禁用预检请求的默认授权器
你只需要在AWS::Serverless::Api的Auth配置里新增AddDefaultAuthorizerToCorsPreflight: false参数,就能告诉SAM:别给自动生成的OPTIONS预检请求绑定默认授权器。
修改后的template.yaml关键部分如下:
Resources: TestApi: Type: AWS::Serverless::Api Properties: StageName: dev Auth: DefaultAuthorizer: testAuthoriser AddDefaultAuthorizerToCorsPreflight: false # 新增这一行,核心修复 Authorizers: testAuthoriser: FunctionArn: Fn::ImportValue: !Sub test-custom-autoriser Identity: Header: Authorization ValidationExpression: ^Bearer [-0-9a-zA-Z\._]*$ ReauthorizeEvery: 30
额外优化建议
你的全局CORS配置里参数带了多余的单引号,SAM支持直接用不带引号的通配符,修改后更简洁还能避免潜在的解析问题:
Globals: Function: Runtime: nodejs8.10 Api: Cors: AllowMethods: "*" AllowHeaders: "*" AllowOrigin: "*"
重新部署模板后,自动生成的OPTIONS方法就不会再绑定自定义授权器,浏览器的预检请求能正常通过,而你的GET请求依然会走自定义授权验证,完美兼顾安全和跨域需求。
内容的提问来源于stack exchange,提问作者GeekOnGadgets
相关产品推荐
相关产品推荐

