Я настроил свой интерфейс с перехватчиком, который всегда добавляет заголовок Authorization, если такой JWT token существует.
У меня есть 2 API, один используется для проверки авторизации, другой используется для обработки любого другого запроса данных (это тот, над которым я работаю).
В моем API данных я хочу добиться следующего:
Создайте своего рода охранник (?), Который я могу разместить вокруг определенных маршрутов api, который проверяет, присутствует ли заголовок Authorization. Затем ему необходимо вызвать другой API, чтобы проверить, действителен ли токен. Если это не удается, он возвращает ошибку, в противном случае он продолжает выполнять требуемый запрос.
Я новичок в node, и я не знаю, как это сделать правильно и наиболее эффективно. У меня недостаточно знаний, поэтому я попытался погуглить, но безрезультатно.
Я не прошу вас, ребята, написать это для меня, я просто ищу идеи, как это сделать, чтобы я мог исследовать это более глубоко, потому что прямо сейчас я не знаю, что искать или это даже возможно.
Спасибо за вашу помощь!
Обновлено: вот как я сейчас обрабатываю запрос
Маршрут
/**
* Add survey for a participant
*
* URL: /participant/survey
* METHOD: POST
*/
router.post('/participant/survey', function(req, res) {
var bodyValidation = iValidator.json_schema(
schema.addSurvey,
req.body,
'survey'
);
if (bodyValidation.valid == false) {
return res.status(422).send(bodyValidation.errorMessage);
}
participantService
.addSurvey(req.body)
.then(data => {
res.status(200).send({ success: true, survey: data });
})
.catch(err => {
res.status(422).send(err);
});
});
Услуга
function addSurvey(survey) {
return new Promise((resolve, reject) => {
participantModel
.addSurvey(survey)
.then(data => {
survey.id = data.insertId;
resolve(survey);
})
.catch(err => {
reject(err);
});
});
}
Модель
function addSurvey(survey) {
return new Promise((resolve, reject) => {
db.query(
'INSERT INTO ...',
(error, result) => {
if (error) {
dbFunc.connectionRelease;
reject(error);
} else {
dbFunc.connectionRelease;
resolve(result);
}
}
);
});
}
@ T.J.Crowder Спасибо за объяснение, как я могу улучшить свой вопрос. Я добавил код, чтобы было понятнее
Как выглядит код авторизации?
Боковое примечание: служба показывает Конструктор Promise, антипаттерн. Вам не нужен и не нужен new Promise в нем; у вас уже есть обещание, от addSurvey. Просто верните результат цепочки на нем: pastebin.com/c2UmdNh5
@ T.J.Crowder У меня нет доступа к этому коду
Нам не нужно видеть внутренности, нам нужно знать, как вы вызов это получите, чтобы получить авторизацию. Но в любом случае двух ответов, которые у вас уже есть, должно быть достаточно, чтобы вы в этом разобрались.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Хотя это сработает, вам, вероятно, лучше использовать функцию промежуточного программного обеспечения вместо как показывает Адам в своем ответе. Использование подобных функций промежуточного программного обеспечения является более компонуемым, что позволяет вам сосредоточиться на конкретной логике каждого маршрута в маршрутах, не беспокоясь о части авторизации. Просто примените промежуточное ПО к соответствующим маршрутам.
Предполагая, что ваши обработчики маршрутов следуют стандартному шаблону:
router.get('/relevant/path', function (req, res) {
res.send(/*...response...*/);
});
... тогда вы просто ждете, чтобы вызвать в res.send, пока не получите ответ на проверку авторизации. Вы не показали нам этот чек, но в полу-псевдокоде:
// If it provides a promise
router.get('/relevant/path', function (req, res) {
checkAuthorization(/*...*/)
.then(result => {
if (result.authorized) {
res.send(/*...response...*/);
} else {
res.send(/*...'not authorized' response...*/);
}
})
.catch(error => {
res.send(/*...error response, auth check failed...*/);
});
});
или же
// If it provides a Node.js-style callback
router.get('/relevant/path', function (req, res) {
checkAuthorization((error, result) => {
if (error) {
res.send(/*...error response, auth check failed...*/);
} else {
if (result.authorized) {
res.send(/*...response...*/);
} else {
res.send(/*...'not authorized' response...*/);
}
}
});
Для узла ваши экспресс-маршруты API обрабатываются в порядке очереди. Таким образом, обычно сначала определяются все конечные точки, которые вы хотите сделать общедоступными, а затем любые маршруты, которые защищены некоторым промежуточным программным обеспечением для аутентификации.
Итак, в вашем случае вы могли бы определить весь маршрут для перехвата. Первый метод будет проверять наличие заголовка авторизации, если вы вызываете next() и Node JS перейдет к проверке следующего маршрута, или если токен не найден, вы можете отклонить запрос тут же.
После функции авторизации вы можете проверить свой API на предмет действительности токена. И примените здесь ту же логику. Возможно, вы захотите рассмотреть возможность кэширования этого ответа в зависимости от накладных расходов / задержки.
app.use((req, res, next) => {
if (<token-exists-condition>){
if (<token-valid-condition>){
// Pass through your middleware onto the next route
next();
} else {
res.status(401).send('Invalid token');
}
} else {
res.status(401).send('No Auth Header');
}
});
Обратитесь к экспресс-документации для получения более подробной информации о том, как использовать промежуточное ПО.
Привет! Пожалуйста, прочтите центр помощи, в частности Как мне задать хороший вопрос?. Людям будет проще помочь вам в много, если вы покажете нам минимальный воспроизводимый пример одного из запросов, где вам нужно это сделать, и пример кода проверки авторизации.