ИСПОЛЬЗОВАНИЕ: Безсерверная структура + Nodejs + AWS
КОНТЕКСТ: у меня есть два этапа (разработка и тестирование), каждый из которых имеет собственную развернутую конечную точку шлюза API для ресурса / missionArea. * http://mlaiehweov/dev/missionArea * http://mlaiehweov/test/missionArea
У меня есть две функции лямбда-авторизации, которые я определил в своем сервисе missionArea. Они имеют ТОЧНЫЙ код логики c (я понимаю, что это может быть избыточно и может измениться позже). Один называется test_auth_hook , а другой dev_auth_hook . Внутри этой аутентификации я декодирую JWT и перехожу к целевой лямбде.
ПРОБЛЕМА: Моя пользовательская аутентификация работала абсолютно нормально, пока я не представил маршруты TEST. Вот что происходит на обоих этапах:
- Я отправляю POST в / login и получаю обратно свой токен JWT.
- Я создаю GET для / missionArea с моим токеном JWT на dev route и я успешно получаю ВСЕ мои missionAreas обратно
Затем я получаю GET для / missionAreas / {1} и получаю: "{" Message ":" Пользователь не авторизован для доступа к этому ресурсу "}"
ТОГДА я немедленно отправляю еще один GET в / missionArea, думая: "хотя бы этот маршрут будет работать", и я получаю {"Message": "Пользователь не авторизован для доступа к этому ресурс "}
ПОТОМ Я отправляю еще один POST в / login, потому что, возможно, мой токен JWT неверен, верно? Так что я получаю еще один токен JWT обратно
- На этот раз, с моим новым JWT, я отправляю GET в / missionArea / {1}, думая, что это маршрут, который обязательно сломается. НО я на самом деле получаю эту миссию. Мне все хорошо.
- Так что теперь я решаю посетить GET для / missionArea, чтобы увидеть ВСЕ мои данные, а затем я получаю {"Message": "Пользователь не авторизован для доступа к этому ресурсу"}
Вещи, которые я пробовал:
- Удаление авторизатора с тестовых маршрутов в шлюзе API полностью устраняет эту проблему на маршрутах разработки.
- Удаление авторизатора на маршрутах разработки полностью устраняет проблему на тестовых маршрутах.
- Я УВЕРЕН, что авторизаторы в TEST и DEV имеют разные имена.
- Мой токен JWT НЕ является проблемой.
- Кеширование отключено на обоих
Довольно интересно. Ошибка, которую я получаю, не выдается из моего специального авторизатора! Я даже не уверен, откуда это исходит.
МОЙ КОД:
**>>>>>> devAuth.ts AND testAuth.ts**
import 'source-map-support/register';
import { buildIAMPolicy } from './utils/buildPolicy';
const jwt = require('jsonwebtoken');
export const devHook = async (event, _context, callback) => {
let token = event.authorizationToken;
token = token.split(' ')[1];
try {
// Verify JWT
const decoded = jwt.verify(token, process.env.JWT_SECRET);
const user = decoded.user;
console.log('DECOEED USER >>>', user);
// Checks if the user's scopes allow her to call the current function
// const isAllowed = authorizeUser(user.scopes, event.methodArn);
const isAllowed = true;
const effect = isAllowed ? 'Allow' : 'Deny';
const userId = user.id;
const authorizerContext = { user: JSON.stringify(user) };
// Return an IAM policy document for the current endpoint
const policyDocument = buildIAMPolicy(
userId,
effect,
event.methodArn,
authorizerContext
);
callback(null, policyDocument);
} catch (e) {
console.log('ERROR MSG:', e);
callback('Unauthorized'); // Return a 401 Unauthorized response
}
};
serverless.yaml
functions:
dev_auth_hook:
handler: devAuth.devHook
test_auth_hook:
handler: testAuth.testHook
getAllMissionAreas:
handler: handler.getAllMissionAreas
events:
- http:
method: GET
path: missionAreas
cors: true
authorizer: dev_auth_hook OR test_auth_hook
РЕШЕНИЕ: Я не знаю, в чем здесь проблема. Мне нужен этот авторизатор для работы на разных этапах. Я почти уверен, что логи c в самой аутентификации не проблема. Вам не разрешено развертывать несколько AWS пользовательских авторизаторов?