如何从AWS lambda授权者返回401而不引发异常

Jey*_*eyJ 12 python amazon-web-services aws-lambda

我有一个用 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}"
    }
Run Code Online (Sandbox Code Playgroud)

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

raise Exception("Unauthorized")
Run Code Online (Sandbox Code Playgroud)

此解决方案的问题在于,AWS lambda 失败,然后执行被标记为执行失败,而不是 lambda 的成功执行。有没有办法在 lambda 失败的情况下返回 401 ?

还尝试了以下类似 lambda 集成的方法,但没有成功:

return  {"statusCode": 401, "body" : "Unauthorized"}
Run Code Online (Sandbox Code Playgroud)

djc*_*hat 11

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

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

现在,关于raise Exception("Unauthorized")污染你的指标,产生模糊的实际错误与这个预期错误,我同意,这有点臭。我唯一的建议是记录一些错误级别,您设置了一个要注意的指标过滤器,并将其用作真正的“出了问题”指标。