Использование промежуточного программного обеспечения Express.JS только на некоторых маршрутах - PullRequest
0 голосов
/ 26 октября 2018

В качестве упражнения по изучению NodeJS я создаю своего рода API с ExpressJS, который отвечает на веб-запросы. На данный момент в программе есть три маршрута: «/ login», «/ register» и «/ changePassword». Все эти методы не требуют какого-либо токена для обработки.

Однако любой другой маршрут, который я планирую добавить в программу (например, маршрут «/ post»), потребует от пользователя аутентификации с помощью токена, полученного из запроса POST для «/ login» с правильным полномочия.

Чтобы проверить токен, я написал функцию промежуточного программного обеспечения:

module.exports.validateToken = function (req,res,next) {
    const token = req.headers['x-access-token']
    console.log(`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 оставили меня в тупике.

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

В Expressjs каждое промежуточное программное обеспечение, которое вы добавляете, добавляется в стек промежуточного программного обеспечения, т.е. FIFO.

Таким образом, если у вас есть определенные маршруты, которые вы не хотите проверять, вы можете просто сохранить ихпромежуточное ПО над другими.

app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use(<<pattern>>, authenticate)

Кроме того, вы можете попробовать использовать для проверки подлинности модуль nodejs basic-auth

Надеюсь, это поможет!

0 голосов
/ 26 октября 2018

Допустим, ваше промежуточное ПО находится в "./middleware/auth"

Я бы создал базовый маршрут, к которому следует применить промежуточное программное обеспечение, например

app.use("/private", require("./middleware/auth"));

Это вызовет ваше промежуточное программное обеспечение для аутентификации на любом маршруте, начинающемся с '/ private'

Таким образом, любой контроллер API, который требует аутентификации, должен быть определен как:

app.use("/private/foo", require("./controllers/foo"));

Ваша функция промежуточного программного обеспечения будет вызываться для любого маршрута в / private до того, как он попадет на ваш контроллер.

И любой, кому не требуется ваше промежуточное программное обеспечение, должен просто оставаться вне контекста «частного» API, например,

app.use("/", require("./controllers/somecontroller"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...