8

我正在将 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 Gateway 中为 401 响应设置标头,遗憾的是浏览器预检期望成功的状态码。

更新。我重新开始实施我的授权人,也考虑过使用 aws auth 服务。

4

2 回答 2

1

这个API Gateway 问题(由 AWS 人员确认)已经存在了几个月。

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


在您的 API Gateway 控制台中,转到您的 API,然后转到Gateway Responses

网关响应

查找Unauthorized (401)并添加以下标头(当然,您可以使用您的域):

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

见下图:

未经授权

于 2017-11-05T13:36:02.257 回答
1
  • 401从 API Gateway 中的方法获取 aOPTIONS是非常不寻常的。我在通话中经常看到403s 和缺少 CORS 标头OPTIONS,但通常不会出现 401。如果您的授权方有问题,我希望随后出现 401 POST,而不是OPTIONS通话中。

  • 您还提到您一直在更改授权人代码以处理此问题。

如果没有看到您的 API 网关配置,我不能肯定地说,但这两个要点表明了一种可能性。听起来您的自定义授权人可能与您的OPTIONS方法挂钩(除了POST您试图公开的任何内容)。这不应该是这样。

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

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

如果这没有帮助,您可以使用 API Gateway 配置以及来自失败OPTIONS调用的请求/响应标头来更新问题。

更新

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

当我部署时,会创建这样的东西:

没有 CORS 的 APIG 配置

我能够从不包含标题401的调用中获取。OPTIONSAuthorization

我添加"cors": true到我的zappa_settings中,它创建了一些对 CORS 更友好的东西:

带有 CORS 的 APIG

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

zappa_settings"cors": true添加看起来像这样:

{
    "dev": {
        "app_function": "hello.app",
        "aws_region": "us-east-1",
        "profile_name": null,
        "project_name": "flask",
        "runtime": "python3.6",
        "s3_bucket": "zappa-xxxxxxxxx",
        "cors": true
    },
    "authorizer": {
    "arn": "arn:aws:lambda:us-east-1:xxxxxxxxxxx:function:flask-authorizer",
    "result_ttl": 0
    }
}
于 2017-11-06T00:03:14.697 回答