В качестве упражнения по изучению NodeJS я создаю своего рода API с ExpressJS, который отвечает на веб-запросы. На данный момент в программе есть три маршрута: «/ login», «/ register» и «/ changePassword». Все эти методы не нуждаются в каких-либо токенах для обработки.
Однако любой другой маршрут, который я планирую добавить в программу (например, маршрут «/ post»), потребует от пользователя аутентификации с помощью токена, полученного из запроса POST, в «/ login» с правильными учетными данными.
Чтобы проверить токен, я написал функцию промежуточного программного обеспечения:
module.exports.validateToken = function (req,res,next) {
const token = req.headers['x-access-token']
console.info(`validateToken() - TOKEN: ${token}`)
if (token) {
//Make sure the token is valid[...]
next()
}else {
return res.status(401).send({
message: 'Missing token',
success: false
})
}
}
У меня вопрос: как применить это промежуточное ПО только к маршрутам, требующим аутентификации? Я подумал о том, чтобы просто создать еще один объект Router и назвать его так:
const tokenValidator = require('./util').validate.validateToken
// Router used for any actions that require user-authentication
const authRouter = new app.Router()
authRouter.use(tokenValidator)
Но будет ли это вообще мешать моим исходным маршрутам без аутентификации?
// Initiate the routes that don't need auth
const routes = require('./routes')(app)
Заранее спасибо, я больше занимаюсь Java-разработкой, поэтому многие причуды Javascript поставили меня в тупик.



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


Допустим, ваше промежуточное ПО находится в "./middleware/auth"
Я бы создал базовый маршрут, для которого должно применяться промежуточное ПО, например
app.use("/private", require("./middleware/auth"));
Это вызовет ваше промежуточное программное обеспечение аутентификации на любом маршруте, который начинается с '/ private'
Таким образом, любой контроллер API, требующий аутентификации, должен быть определен как:
app.use("/private/foo", require("./controllers/foo"));
Ваша функция промежуточного программного обеспечения будет вызываться для любого маршрута в / private, прежде чем она попадет в ваш контроллер.
И все, что не требует вашего промежуточного программного обеспечения, должно просто оставаться за пределами `` частного '' контекста api, например
app.use("/", require("./controllers/somecontroller"));
Нет проблем, хомбре!
В Expressjs каждое добавляемое промежуточное ПО добавляется в стек промежуточного программного обеспечения, то есть в FIFO.
Таким образом, если у вас есть определенные маршруты, для которых вы не хотели бы иметь аутентификацию, вы можете просто поставить их промежуточное ПО выше других.
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use(<<pattern>>, authenticate)
Кроме того, вы можете попробовать использовать модуль nodejs базовая авторизация для аутентификации.
Надеюсь это поможет!
Предпочитаю, чтобы вещи были как можно более ванильными! Одна из моих самых больших претензий к nodejs / javascript заключается в том, что каждая проблема, кажется, решается другой библиотекой! Это не то, как учиться
Ага. Опять же, чтобы поэкспериментировать, проще использовать уже существующую библиотеку, чем заново изобретать колесо :). Да, на производственных серверах имеет смысл использовать родной!
Это сработало отлично, мне вообще не пришлось создавать второй маршрутизатор. Ваше здоровье!