QuikProBroNa
QuikProBroNa

Reputation: 816

Node.js: Passport, checking if the user had already logged in

I have this express router for users that logs in the users using the token system:

var express = require('express');
var router = express.Router();
var passport = require('passport');
var User = require('../models/user');
var Verify = require('./verify');

router.post('/register', function(req, res) {
    User.register(new User({ username : req.body.username }),
      req.body.password, function(err, user) {
        if (err) {
            return res.status(500).json({err: err});
        }
        passport.authenticate('local')(req, res, function () {

            return res.status(200).json({status: 'Registration Successful!'});
        });
    });
});

router.post('/login', function(req, res, next) {

  passport.authenticate('local', function(err, user, info) {
    if (err) {
      return next(err);
    }
    if (!user) {
      return res.status(401).json({
        err: info
      });
    }
    req.logIn(user, function(err) {
      if (err) {
        return res.status(500).json({
          err: 'Could not log in user'
        });
      }

      var token = Verify.getToken(user);
        res.status(200).json({
        status: 'Login successful!',
        success: true,
        token: token
      });
    });
  })(req,res,next);

});

module.exports = router;

The Verify file:

var User = require('../models/user');
var jwt = require('jsonwebtoken'); // used to create, sign, and verify tokens
var config = require('../config.js');

exports.getToken = function (user) {
    return jwt.sign(user, config.secretKey, {
        expiresIn: 3600
    });
};

exports.verifyOrdinaryUser = function (req, res, next) {
    // check header or url parameters or post parameters for token
    var token = req.body.token || req.query.token || req.headers['x-access-token'];

    // decode token
    if (token) {
        // verifies secret and checks exp
        jwt.verify(token, config.secretKey, function (err, decoded) {
            if (err) {
                var err = new Error('You are not authenticated!');
                err.status = 401;
                return next(err);
            } else {
                // if everything is good, save to request for use in other routes
                req.decoded = decoded;
                next();
            }
        });
    } else {
        // if there is no token
        // return an error
        var err = new Error('No token provided!');
        err.status = 403;
        return next(err);
    }
};

Now, I am validating if the user is logged in using the success attribute. I want my route to check if the user is already logged in the login route before going through the passport authentication. How do I achieve this?

Upvotes: 2

Views: 1891

Answers (2)

Hasan Daghash
Hasan Daghash

Reputation: 1691

you need something like this :

var auth = function(req, res, next){
   if (!req.isAuthenticated())
    res.send(401);
     else next();
   };

Upvotes: 1

Jesus Mendoza
Jesus Mendoza

Reputation: 323

Add it to your route, for example:

app.route('/checkout', verifyOrdinaryUser, function(req, res) {
});

That function will run before the callback with the request and response objects, so if it's not authenticated, it will do whatever you tell it to do, if it's authenticated, it will continue

Upvotes: 0

Related Questions