【问题标题】:zappa custom authorizer for flask with corszappa 自定义授权器,用于带 cors 的烧瓶
【发布时间】:2018-04-14 02:42:59
【问题描述】:

我正在将 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 服务。

【问题讨论】:

  • 你的代码在哪里,如何重现你的问题?
  • 请提供一个简单的git repo,以便调试问题
  • 你试过my answer below吗?我遇到了和你一样的问题。
  • 好的,今晚试试,似乎是一种解决方法,但一步一步的指导很好
  • 试过 dashmug 解决方案,遗憾的是仍然相同的 401 并且没有 cors 标题

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


【解决方案1】:

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

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


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

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

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

见下图:

【讨论】:

  • 试过了,令人惊讶的是没有用 - 得到 401 没有标题
  • 可能是一些奇怪的权限?
  • 在发布 api 更改后成功使用标头。由于无法加载 https://u....,POST 仍然未通过:预检响应具有无效的 HTTP 状态代码 401
  • 显然浏览器需要“成功”状态码
【解决方案2】:
  • 从 API Gateway 中的 OPTIONS 方法获取 401 非常 异常。我在OPTIONS 调用中看到403s 和缺少CORS 标头 相当多,但通常不是 401。如果您的授权人有问题,我希望随后的 POST 出现 401,而不是 OPTIONS 调用。

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

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

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

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

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

更新

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

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

我能够从不包含 Authorization 标头的 OPTIONS 调用中获取 401

我将"cors": true 添加到我的zappa_settings,这创造了更友好的CORS:

这个配置看起来更好。不再有来自OPTIONS401,无论是否存在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
    }
}

【讨论】:

  • 我正在尝试使用 zappa 进行一键上传,目前方法授权者不提供。
  • 我试图按下“启用 cors”按钮,该按钮在未经授权的情况下创建 OPTIONS 资源但没有帮助。你知道如何解开 Options
  • @Serge 我在 AWS 控制台中尝试“手动”启用 CORS 时也遇到了一些麻烦。我用你可以尝试的东西更新了我的答案。您的zappa_settings 是否包含"cors": true
  • 产生了不同的错误代码 403 Forbidden Exception, no cors headers
猜你喜欢
  • 2021-11-23
  • 2020-09-08
  • 2021-05-20
  • 2018-08-22
  • 2020-06-27
  • 2015-01-30
  • 1970-01-01
  • 2015-05-25
  • 2014-10-28
相关资源
最近更新 更多