Пользовательский ответ Lambda Authorizer для 401
Вызов функции обратного вызова Lambda из Lambda Authorizer со строкой Unauthorized
в параметре error возвращает 401 ответ с телом:
{ "message": "Unauthorized" }
Попытка использовать любую другую строку в ответе приводит к ответу:
{ "message": null }
Если вместо этого вы вернете документ Deny Policy Document в параметре результата обратного вызова, вы получите 403 с ответом что-то вроде:
{ "message": "Unable to access resource with an explicit deny" }
После осмотра кажется, что вам нужно сконфигурировать Ответ шлюза, чтобы он возвращал пользовательский ответ от Lambda Authorizer, который я работаю для ответа 403, но не могу понять, как это сделать для 401.
Для 403 я создал ответ шлюза с шаблоном:
{\"message\":\"$context.authorizer.stringKey\"}
Затем на объекте результата я установил следующее
ResultObject.context.stringKey = 'My custom response'
Это работает и задокументировано здесь.
Однако для 401, потому что я не возвращаю документ политики, я не знаю, как использовать пользовательский ответ. Я создал тот же самый ответ шлюза, что и для 403, но если я нажму на обратный вызов любой строкой (кроме "Неавторизованной") в параметре ошибки, я получу нулевое сообщение. Я не могу вернуться в параметре результата, потому что это должна быть структура ответа, содержащая документ политики.
Любые идеи о том, как я могу вернуть пользовательский ответ с 401?
0 ответов
Извините, что не отвечаю на ваш прямой вопрос, но я думаю, что люди (как и я) могут столкнуться с этой веткой, когда смотрят, как реализовать первую часть вашего вопроса (вернуть ответ 401 от lambda авторизатора). Вы можете следовать примеру AWS здесь.
TL; DR:
Для асинхронных функций выведите ошибку, сообщение которой точно соответствует строке "Unauthorized"
:
exports.handler = async function (event) {
...
throw Error("Unauthorized");
}
Для синхронизации. вызывать функцию обратного вызова с первым параметром (ответом на ошибку), точно совпадающим со строкой "Unauthorized"
:
exports.handler = function(event, context, callback) {
..
callback("Unauthorized"); // Compared to a successful response `callback(null, ...)`
}
В обоих случаях ответ от конечной точки шлюза API, защищенной вашей лямбда-авторизатором, будет:
401
{
"message": "Unauthorized"
}
Вам нужно вызвать исключение, поэтому при использовании узла:
context.fail("Unauthorized");
Для C# см. http://yogivalani.com/aws-custom-lambda-authorizer-returns-401-unauthorized/