#javascript #node.js #express
#javascript #node.js #выразить
Вопрос:
Итак, я хотел передать параметр промежуточному программному обеспечению, но у меня возникли проблемы с некоторыми моментами.
У меня есть эта функция в обработчике маршрутов:
router.get('/users', auth.required, userController.findAll);
Затем он перейдет к функции аутентификации, которая вызывает getTokenFromHeaders
:
const auth = {
required: jwt({
secret: 'secret',
userProperty: 'payload',
getToken: getTokenFromHeaders,
}),
...
};
В getTokenFromHeaders
функции токен извлекается и проверяется, это выглядит так:
const getTokenFromHeaders = (req) => {
...
return token; // Or null in case it's not there or incorrect
Итак, моей целью было бы передать подобный параметр auth.required('role')
для проверки роли пользователя внутри getTokenFromHeaders
функции (определение дополнительных функций аутентификации также было бы неплохо (auth.admin, auth.как бы то ни было, …)
Я уже пытался изменить его следующим образом:
const auth = {
required: jwt({
secret: 'secret',
userProperty: 'payload',
getToken: getTokenFromHeaders(req, res, role),
}),
Но в нем говорится, что req и res не определены.
Есть ли какой-нибудь способ сделать это?
Комментарии:
1. Откуда будет
'role'
исходить?
Ответ №1:
get
метод получает путь и 2 обратных вызова, где первый является промежуточным программным обеспечением:
router.get('/users', auth, userController.findAll);
Промежуточное программное обеспечение похоже findAll
на функцию и выполняется перед:
var auth = function (req, res) {
// Get token from header (http://expressjs.com/en/api.html#req.get)
var token = req.get("myToken");
// TODO Validate token:
var isValid = someFunction(token);
if (!isValid) {
// ************
// TODO Check if user can access this resource
// ************
res.json("not authorized");
}
// Go to findAll (next callback)
};
Я предлагаю вам взглянуть на документы специально в app.use, чтобы лучше понять, как промежуточное программное обеспечение работает в express.
Комментарии:
1. Спасибо! Это помогло мне реализовать решение и лучше понять, как работает промежуточное программное обеспечение: D
Ответ №2:
Я думаю, что :
1) Вызов запроса
app.use('/users', required);
2) Проверьте аутентификацию
const required = (req, res, next) => {
const auth = {
required: jwt({
secret: 'secret',
userProperty: 'payload',
getToken: getTokenFromHeaders(req),
}),
...
};
if (auth.required) next();
else // error
}
3) Следующий шаг
router.get('/users', userController.findAll);
4) UserController.findAll
UserController.findAll отправит ответ с восстановленными параметрами (req и res)