В настоящее время я немного играю с AWS AppSync и пытаюсь использовать функцию авторизации Lambda для выполнения некоторой пользовательской аутентификации для GraphQL API.
У меня есть функция Lambda, настроенная с правильной политикой на основе ресурсов, позволяющая AppSync вызывать эту функцию, и я настроил AppSync Default authorization mode
для вызова моей Lambda.
Это мой лямбда-код:
exports.handler = (event) => {
console.info(JSON.stringify(event));
const response = {
isAuthorized: true,
};
console.info(JSON.stringify(response));
return response;
};
Теперь я столкнулся с проблемой, что авторизатор Lambda всегда выдает мне следующую ошибку, когда я пытаюсь запустить карьер GraphQL:
Error: Request failed with status code 401
После двух часов отладки этой проблемы могу сказать следующее:
Default authorization mode
на API key
или Amazon cognito user pool
без каких-либо изменений, мой запрос выполняется успешно.{"isAuthorized":true}
, что означает, что никакое Authorization Token
не приведет к 401
.Итак, насколько я могу судить, все в порядке, но я все еще получаю 401
независимо от того, что я делаю, и я очень расстраиваюсь.
После очень разочаровывающей отладки я наконец понял, что проблема была в функции обработчика Lambda. Как оказалось, лямбда-обработчики Node.js должны быть асинхронными.
Таким образом, изменение лямбды на следующий код устраняет проблему:
exports.handler = async (event) => {
console.info(JSON.stringify(event));
const response = {
isAuthorized: true,
};
console.info(JSON.stringify(response));
return response;
};
Я не знал этого, так как до тех пор я использовал Python только для Lambdas, и проблему было трудно обнаружить, поскольку console.info
все еще работал правильно, поэтому я думал, что функция возвращает правильные данные, хотя на самом деле она возвращала null
.