2017-12-06 4 views
1

Ich habe eine Knoten-Anwendung mit express und jsonwebtoken ausgeführt. Ich habe vor jeder Anfrage für die API-Aufrufe eine Überprüfung vorgenommen, um die jsonwebtoken zu überprüfen. Ich habe die Routen wie unten manuell ausgeschlossen. Gibt es einen besseren Weg, einige Routen davon auszuschließen? Wie kann ich das machen?Express + JWT bestimmte Routen ausschließen

import * as express from 'express'; 
import * as jwt from 'jsonwebtoken'; 

import UserCtrl from './controllers/user'; 

export default function setRoutes(app) { 

    const router = express.Router(); 

    // route middleware to verify a token 
    router.use(function (req, res, next) { 
    if ((req.method == 'POST' || req.method == 'OPTIONS') && (req.url == '/user' || req.url == '/login' || req.url == '/user/activate')) { 
     next(); 
    } else { 
     // check header or url parameters or post parameters for token 
     var token = req.headers.authorization; 
     // decode token 
     if (token) { 
     // verifies secret and checks exp 
     jwt.verify(token, process.env.SECRET_TOKEN, function (err, decoded) { 
      if (err) { 
      return res.status(401).send({ 
       success: false, 
       message: 'Sign in to continue.' 
      }); 
      } else { 
      // if everything is good, save to request for use in other routes 
      next(); 
      } 
     }); 
     } else { 
     // if there is no token 
     // return an error 
     return res.status(401).send({ 
      success: false, 
      message: 'Sign in to continue.' 
     }); 
     } 
    } 
    }); 

    const userCtrl = new UserCtrl(); 

    router.route('/login').post(userCtrl.login); 
    router.route('/user/activate').post(userCtrl.activate); 
    router.route('/users').get(userCtrl.getAll); 
    router.route('/users/count').get(userCtrl.count); 
    router.route('/user').post(userCtrl.signup); 
    router.route('/user/:id').get(userCtrl.get); 
    router.route('/user/:id').put(userCtrl.update); 
    router.route('/user/:id').delete(userCtrl.delete); 

    app.use('/api/v1', router); 
} 

Antwort

2

können Sie verwenden, um die Funktion, die Sie geschrieben haben, die jwt, um zu überprüfen und sicherzustellen, dass der Benutzer als Middleware für bestimmte Routen in Ihrem Router angemeldet. Auf diese Weise müssen Sie nicht angeben, welche Routen sich in der Funktion anmelden müssen.

So:

function isLoggedIn(req, res, next) { 
    // check header or url parameters or post parameters for token 
    var token = req.headers.authorization; 
    // decode token 
    if (token) { 
     // verifies secret and checks exp 
     jwt.verify(token, process.env.SECRET_TOKEN, function(err, decoded) { 
      if (err) { 
       return res.status(401).send({ 
        success: false, 
        message: 'Sign in to continue.' 
       }); 
      } else { 
       // if everything is good, save to request for use in other routes 
       next(); 
      } 
     }); 
    } else { 
     // if there is no token 
     // return an error 
     return res.status(401).send({ 
      success: false, 
      message: 'Sign in to continue.' 
     }); 
    } 
} 

const userCtrl = new UserCtrl(); 

// Routes that require no login 
router.post('/login', userCtrl.login); 
router.get('/users', userCtrl.getAll); 
router.post('/user/activate', userCtrl.activate); 

// Routes that require login 
router.get('/users/count', isLoggedIn, userCtrl.count); 
router.post('/user', isLoggedIn, userCtrl.signup); 
router.get('/user/:id', isLoggedIn, userCtrl.get); 
router.put('/user/:id', isLoggedIn, userCtrl.update); 
router.delete('/user/:id', isLoggedIn, userCtrl.delete); 

app.use('/api/v1', router); 

Sie können mehr über Express Middlewares here lesen.

+1

danke! funktioniert super!! – JackSlayer94