带有cors

时间:2017-11-01 17:39:18

标签: python amazon-web-services aws-lambda zappa flask-cors

我正在使用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响应设置标头,遗憾的是浏览器预检需要成功的状态代码。

2 个答案:

答案 0 :(得分:1)

API Gateway problem(已由AWS人员确认)已存在数月。

幸运的是,他们最近(2017年6月)发布了一种使用Gateway Responses修复它的方法。

在API网关控制台中,转到您的API,然后转到网关响应

Gateway Responses

寻找未授权(401)并添加以下标题(当然,您可以使用您的域名):

Access-Control-Allow-Headers: '*'
Access-Control-Allow-Origin: '*'

见下图:

Unauthorized

答案 1 :(得分:1)

  • 从API网关中的401方法获取OPTIONS非常有用 异常。我在403次调用中看到OPTIONS s并缺少CORS标头 相当多,但一般不是401.如果你的授权人有问题,我会期待随后的POST上的401,而不是OPTIONS来电。

  • 您还提到您一直在更改授权人代码 努力解决这个问题。

如果没有看到您的API网关配置,我无法肯定地说,但这两个要点提示了一种可能性。 听起来像您的自定义授权程序可能会与您的OPTIONS方法相关联(除了POST或您尝试公开的任何内容)。情况并非如此。

例如,如果您将自定义(令牌类型)授权程序附加到API网关资源的OPTIONS方法,然后在没有授权标头的情况下进行OPTIONS调用,您将获得401

您的自定义授权程序只应附加到您明确公开的方法。在许多情况下,这只是POST,但可能包括PUTDELETE等其他内容。

如果这没有帮助,您可以使用API​​网关配置更新问题,并通过失败的OPTIONS调用更新请求/响应标头。

<强>更新

我使用Zappa部署了一个HelloWorld烧瓶应用程序,我想我能够重现您的问题。我正在使用您链接到自定义授权器的蓝图。将policy.denyAllMethods()更改为policy.allowAllMethods()是我对此所做的唯一更改。

部署时,会创建以下内容:

APIG configuration without CORS

我能够从不包含401标头的OPTIONS次来电中获得Authorization

我将"cors": true添加到我的zappa_settings,这创建了更多CORS友好的东西:

APIG with CORS

此配置看起来更好。不再401来自OPTIONS,是否存在Authorization标头。

我添加zappa_settings的{​​{1}}看起来像这样:

"cors": true