Проблема, я думаю, в том, что ваш авторизатор отправляет обратно.В вашем документе политики вы можете видеть, что вы возвращаете Resource: event.methodArn
.
Это обычно работает, если ваш авторизатор не кэширует ответ от вашего специального авторизатора (он включен по умолчанию).Проблема, с которой вы сталкиваетесь, возникает, когда вы делаете запрос API Gateway и возвращаете кешированный ответ авторизатора, который не соответствует запрошенному ARN текущего запроса. В этом посте объясняется, как работают авторизаторы Lambda, в том числе кэширование .
Чтобы убедиться в этом, перейдите в консоль AWS и отключите кэширование для своего пользовательского авторизатора;как только вы это сделаете, вы больше не будете испытывать эту проблему.
Так как вы можете исправить это в долгосрочной перспективе?Есть несколько вариантов:
Отключить кэширование : это самое простое решение.Недостатком является то, что вы теперь вызываете свой авторизатор с каждым запросом, который увеличивает задержку в вашем API.
Возвращает более широкую политику : это лучшее решение, но более сложное.Здесь есть несколько вариантов, вы можете вернуть несколько Allow
политик в вашем ответе авторизатора, которые применяются к любой конечной точке, которая использует этот авторизатор.
Если вы посмотрите на формат запроса авторизатора вы увидите, что 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
A более широкогоПолитика, которая будет применяться к любому ресурсу для этой конечной точки:
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"
}
]
}
}