Как сделать общую привязку токена JWT к каждому маршруту, используя Node.js и express - PullRequest
1 голос
/ 12 июля 2020

Я использую аутентификацию токена JWT в моем приложении Node.js и express. Но для каждого маршрута я вызываю метод проверки токена, и мой код приведен ниже.

route. js:

const express = require('express'),
      controller = require('../controller/customer.controller'),
      verify = require('../utill/verify.util.js'),
      Router = express.Router();




class DemoProjectRouter {

    getRouter() {

        try{
            Router.get('/', verify.verifyToken, controller.getCustomer.bind(controller));
            Router.post('/add',verify.verifyToken, controller.addCustomer.bind(controller));
            return Router;

        }catch(error) {
            console.log(error);
        }
    }
}

module.exports = new DemoProjectRouter();

Ниже файл Я проверяю токен.

const jwt = require('jsonwebtoken');
const _ = require('lodash');

const jwtKey = "my_secret_key"
const jwtExpirySeconds = '2d';



class DemoProjectJWT {

    async createJWT(username) {

        try{

            let obj = {};

            obj['username'] = username;

            const token = jwt.sign(obj, jwtKey, {algorithm: "HS256", expiresIn: jwtExpirySeconds});

            return token;

        }catch(error){
            console.log(error);
        }
    }


    async verifyToken(req, res, next) {

        try{

            let token =  '';

            if (_.get(req,['body', 'token'])) {
                token = req.body.token;
            }
            if (_.get(req,['query', 'token'])) {
                token = req.query.token;
            }
            if (_.get(req,['headers', 'x-access-token'])) {
                token = req.headers['x-access-token'];
            }
            if (_.get(req,['cookies', 'token'])) {
                token = req.cookies.token;
            }

            if (token === '' || token === null) {
                let err = new Error('No token provided!');
                err.status = 403;
                res.send(err);
            }else{

                jwt.verify(token, jwtKey, (err, decode) => {
                    if (err) {

                        if (err.name === 'TokenExpiredError') {

                            console.log("token expired!");

                            let err = new Error('You are not authenticated!');
                            err.status = 401;
                            res.send(err);
                        }
                    }else{
                        req.decoded = decode;
                        next();
                    }
                })
            }

        }catch(error) {
            console.log(error);
        }
    }
}

module.exports = new DemoProjectJWT();

Здесь я привязываю свой токен к каждому методу маршрута, но мне нужно написать любой общий метод, в котором он будет включать токен в каждый маршрут для проверки, чтобы, если я создавая любой новый метод маршрута, я не буду снова добавлять verify.verifyToken для проверки. для каждого запроса пользователя он должен вызываться автоматически.

Ответы [ 2 ]

1 голос
/ 12 июля 2020

Вам необходимо зарегистрировать обработчик проверки токена как промежуточное ПО уровня маршрутизатора :

Router.use(verify.verifyToken);

Router.get('/', controller.getCustomer.bind(controller));
Router.post('/add', controller.addCustomer.bind(controller));
0 голосов
/ 12 июля 2020

Вы можете сделать это с помощью промежуточного программного обеспечения уровня приложения.

Но не забудьте поместить соответствующий лог c в это промежуточное программное обеспечение, поскольку оно будет вызываться для всех маршрутов.

app.use('*', (req, res, next) => {
  if (verify.verifyToken()) {
    next();
  } else {
    // Do something else
  }
})
...