【问题标题】:How to return 401 from AWS lambda authorizer without raising an exception如何从 AWS lambda 授权方返回 401 而不会引发异常
【发布时间】:2021-03-25 04:13:27
【问题描述】:

我有一个用 Python 编写的 lambda 授权器。

我知道使用以下访问策略我可以返回 200/403:

{
        "principalId": "yyyyyyyy",
        "policyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": "execute-api:Invoke",
                    "Effect": "Deny",
                    "Resource": "*"
                }
            ]
        },
        "context": {
            "stringKey": "value",
            "numberKey": "1",
            "booleanKey": "true"
        },
        "usageIdentifierKey": "{api-key}"
    }

如果客户没有发送任何令牌,我会尝试返回 401 错误,因此我会引发异常:

raise Exception("Unauthorized")

此解决方案的问题在于 AWS lambda 失败,然后将执行标记为失败执行,而不是 lambda 的成功执行。有什么方法可以返回 401 而不会导致 lambda 失败?

还在 lambda 集成中尝试了以下类似但没有奏效:

return  {"statusCode": 401, "body" : "Unauthorized"}

【问题讨论】:

  • 引发该异常是从授权方返回 401 的唯一方法。您无法像在 lambda 代理集成中那样自定义状态代码/响应正文。
  • @Phydeaux 我们独立地遇到了与 OP 相同的问题。你的评论似乎错过了这个问题的真正问题。 OP 和我们都尝试了引发异常方法。 OP问这个问题的原因我认为是因为引发异常方法不是wordking。使用python和代码raise Exception("Unauthorized")制作lambda授权会导致lambda函数执行失败(即异常没有被捕获调用 lambda 处理程序的代码)。此外,调用 api 网关的响应是 500 内部服务器错误。
  • 所以对我来说,AWS 中的 api 网关/lambda 处理程序代码似乎有问题,没有按文档说明工作。因为我希望引发未经授权的异常会导致 401 未经授权而不是 500 内部服务器错误(当未捕获的 lambda 函数抛出错误时,默认响应也是如此)。
  • 附注我想修改问题以提供更多有用的信息。但遗憾的是,建议的编辑队列已满,我没有足够的代表开始审查编辑。
  • @M.D.请随时在此处添加详细信息,我将编辑帖子

标签: python amazon-web-services aws-lambda


【解决方案1】:

这确实很难看,但这是真正发出 401 信号的唯一方法,这意味着“我找不到您的授权标头或 cookie 或什么都没有,您必须进行身份验证才能做到这一点”。 403 是一个明确的 ? 表示“我知道你是谁,你被禁止这样做”。 API 网关在这里需要一个奇怪的三元响应:?/?/?,而这种“抛出一个非常具体的异常”是一种方法。

因此您无法使用授权 lambda 自定义响应;你只能给出一个回复文件说是/否,或者举手示意“我在这里找不到任何认证材料”。要自定义对客户端的响应的形状,您可以使用Gateway Responses。有了这个,您可以自定义 401/403 响应的 json(或任何内容类型,实际上)的形状。

现在,关于raise Exception("Unauthorized") 污染您的指标,制造模棱两可的真实错误与这个预期的错误,我同意,它有点臭。我唯一的建议是记录您设置Metric Filter 以提防的错误级别,并将其用作您真正的“出现问题”指标。

【讨论】:

    猜你喜欢
    • 2021-01-07
    • 2019-12-12
    • 1970-01-01
    • 2017-11-12
    • 2020-03-23
    • 1970-01-01
    • 2016-05-22
    • 2018-06-02
    • 2019-08-06
    相关资源
    最近更新 更多