Пользовательский ответ 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/

Другие вопросы по тегам