我正在使用flask-cors来获取aws python aws lambda API。我用zappa部署它,它按预期工作。然而,cors不适用于自定义授权者 灵感来自https://github.com/awslabs/aws-apigateway-lambda-authorizer-blueprints/blob/master/blueprints/python/api-gateway-authorizer-python.py
我使用try / except更改了授权者代码,并在异常时为OPTION方法生成策略,但Option方法仍然返回401.
如果事情变得简单,我不介意解决方法。
由于
我尝试了一种建议的解决方案:即在API网关中为401响应设置标头,遗憾的是浏览器预检需要成功的状态代码。
答案 0 :(得分:1)
此API Gateway problem(已由AWS人员确认)已存在数月。
幸运的是,他们最近(2017年6月)发布了一种使用Gateway Responses修复它的方法。
在API网关控制台中,转到您的API,然后转到网关响应。
寻找未授权(401)并添加以下标题(当然,您可以使用您的域名):
Access-Control-Allow-Headers: '*'
Access-Control-Allow-Origin: '*'
见下图:
答案 1 :(得分:1)
从API网关中的401
方法获取OPTIONS
非常有用
异常。我在403
次调用中看到OPTIONS
s并缺少CORS标头
相当多,但一般不是401.如果你的授权人有问题,我会期待随后的POST
上的401,而不是OPTIONS
来电。
您还提到您一直在更改授权人代码 努力解决这个问题。
如果没有看到您的API网关配置,我无法肯定地说,但这两个要点提示了一种可能性。 听起来像您的自定义授权程序可能会与您的OPTIONS
方法相关联(除了POST
或您尝试公开的任何内容)。情况并非如此。
例如,如果您将自定义(令牌类型)授权程序附加到API网关资源的OPTIONS
方法,然后在没有授权标头的情况下进行OPTIONS
调用,您将获得401
。
您的自定义授权程序只应附加到您明确公开的方法。在许多情况下,这只是POST
,但可能包括PUT
,DELETE
等其他内容。
如果这没有帮助,您可以使用API网关配置更新问题,并通过失败的OPTIONS
调用更新请求/响应标头。
<强>更新强>
我使用Zappa部署了一个HelloWorld烧瓶应用程序,我想我能够重现您的问题。我正在使用您链接到自定义授权器的蓝图。将policy.denyAllMethods()
更改为policy.allowAllMethods()
是我对此所做的唯一更改。
部署时,会创建以下内容:
我能够从不包含401
标头的OPTIONS
次来电中获得Authorization
。
我将"cors": true
添加到我的zappa_settings
,这创建了更多CORS友好的东西:
此配置看起来更好。不再401
来自OPTIONS
,是否存在Authorization
标头。
我添加zappa_settings
的{{1}}看起来像这样:
"cors": true