在缓存授权方响应时获取 403

Getting 403 while the authorizer response is cached

我有两个使用相同 LambdaTokenAuthorizer 的 lambda 函数(A 和 B),它们配置了以下身份

Identity:
    Header: Authorization
    ValidationExpression: Bearer.*
    ReauthorizeEvery: 30 # cache for 30 s

第一个和后续请求 (对 A) 已获得授权并正确解析,但在缓存授权方响应之后和期间对 B 的任何请求 (从之前对 A) 的请求,将失败并显示 403 和以下消息:

{ message: "User is not authorized to access this resource" }

这是预期的行为吗?我在文档中找不到任何相关信息。

默认授权方(顺便说一句,默认缓存 300 秒)是一个选项还是反模式?

有没有办法解决这个问题(除了设置 ReauthorizeEvery: 0)?

假设如果授权方是共享的,那么它永远不应该缓存响应是否正确?

编辑:我知道之前有人“回答”过这个问题,但是文档没有说明缓存的工作原理。如果请求的资源不同,我希望授权方不会使用缓存。

最可能的原因是授权方输出。您将从 Authorizer 生成如下所示的输出 -

{
    "principalId": "some-id",
    "policyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "execute-api:Invoke",
                "Effect": "Allow",
                "Resource": "arn:aws:execute-api:xx-region-1:123456789012:abc/test/GET/lambdaA"
        ]
    }
}

注意上面的 Resource 属性。您可能非常具体地通过指定 Lambda A 或 Lambda B 的 ARN 来允许 Lambda 函数(也许您是根据某些输入动态生成它)。尝试将其更改为

"Resource": "*"

因为您对两个不同的 Lambda 函数使用相同的授权器并且您正在使用缓存,所以您需要确保授权器的输出允许执行两个 Lambda 函数。

Is a default authorizer (that, by the way, is cached for 300s by default) even an option or is it an anti-pattern?

绝对不是。对多个功能使用一个通用的授权器可以减少很多维护开销。使用这种方法只需部署一次核心身份验证逻辑中的任何更改。

Is it correct to assume that if an authorizer is shared, then it should never cache the response?

没有。即使授权方是共享的,我们也可以缓存响应。这确保如果用户通过身份验证可以访问 ServiceA.FunctionA,he/she 可以访问 ServiceA 的任何其他功能而无需再次检查他们的身份验证。