在缓存授权方响应时获取 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 的任何其他功能而无需再次检查他们的身份验证。
我有两个使用相同 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 的任何其他功能而无需再次检查他们的身份验证。