我认为问题出在您的授权者发回的响应中。在您的保单文件中,您可以看到您正在返回Resource: event.methodArn
.
如果您的授权者没有缓存来自自定义授权者的响应(默认情况下处于启用状态),这通常会起作用。当您发出请求 API Gateway 并返回与当前请求的请求 ARN 不匹配的缓存授权者响应时,就会出现您遇到的问题。这篇文章详细介绍了 Lambda 授权方的工作原理,包括缓存 https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html.
您可以通过进入 AWS 控制台并禁用自定义授权者的缓存来验证这是否是问题所在;一旦你这样做了,你就不会再遇到这个问题了。
那么如何才能解决这个长期问题呢?有几个选择:
禁用缓存: 这是最简单的解决方案。缺点是您现在每次请求都会调用您的授权者,这会给您的 API 带来更多延迟。
返回更广泛的政策:这是最好的解决方案,但更复杂。这里有几个选项,您可以返回多个Allow
授权者响应中适用于使用此授权者的任何端点的策略。
如果你看一下授权请求的格式 https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-lambda-authorizer-input.html你会看到methodArn
格式如下:
{
"type":"TOKEN",
"authorizationToken":"{caller-supplied-token}",
"methodArn":"arn:aws:execute-api:{regionId}:{accountId}:{appId}/{stage}/{httpVerb}/[{resource}/[{child-resources}]]"
}
所以你可能会返回这样的东西methodArn
:
arn:aws:execute-api:us-west-2:123456789012:ymy8tbxw7b/*/GET/my-resource/e56bde3c-7c77-46c6-bdf0-ab4a8cb5f5ca
适用于该端点的任何资源的更广泛的策略是:
arn:aws:execute-api:us-west-2:123456789012:ymy8tbxw7b/*/GET/my-resource/*
如果您有多个端点使用同一授权者,则您可以返回多个策略:
{
"principalId": "user",
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Allow",
"Resource": "arn:aws:execute-api:us-west-2:123456789012:ymy8tbxw7b/*/GET/my-resource/*"
},
{
"Action": "execute-api:Invoke",
"Effect": "Allow",
"Resource": "arn:aws:execute-api:us-west-2:123456789012:ymy8tbxw7b/*/POST/my-resource"
}
]
}
}