0

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

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)?

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

编辑:我知道这是“回答”之前,但文档没有说明缓存是如何工作的。如果请求的资源不同,我希望授权者不使用缓存。

4

1 回答 1

1

最可能的原因是 Authorizer 输出。您将从 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 函数使用相同的 Authorizer 并且您正在使用缓存,所以您需要确保 Authorizer 的输出允许执行这两个 Lambda 函数。

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

当然不。为多种功能使用通用授权器可减少大量维护开销。使用此方法只需部署一次核心身份验证逻辑的任何更改。

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

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

于 2020-11-15T19:33:56.970 回答