2016-04-14 5 views
2

Ich habe diese ausdrückliche Router für Benutzer, die in den Benutzer unter Verwendung des Token-System anmeldet:Node.js: Reisepass, zu überprüfen, ob der Benutzer bereits angemeldet hatte

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; 

Die Verify-Datei:

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); 
    } 
}; 

Jetzt überprüfe ich, ob der Benutzer mit dem Erfolgsattribut angemeldet ist. Ich möchte, dass meine Route überprüft, ob der Benutzer bereits in der Login-Route angemeldet ist, bevor er die Pass-Authentifizierung durchläuft. Wie erreiche ich das?

Antwort

0

es zu Ihrer Route hinzufügen, zum Beispiel:

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

Diese Funktion wird vor dem Rückruf mit den Anfrage- und Antwortobjekten läuft, also wenn es nicht authentifiziert ist, wird es tun, was Sie sagen, es zu tun, wenn es authentifiziert ist, wird es weiterhin

+0

Ähm, könnten Sie mir pls sagen, wie es in meinem Code passen würde? – QuikProBroNa

+0

Genau so haben Sie schon die Funktion, das Token "verifyOrdinaryUser" richtig zu prüfen. Fügen Sie es Ihrer Route hinzu, so wie ich es Ihnen zuvor gezeigt habe –

+0

Ähm, das ist nicht meine Frage. Ich möchte den Benutzer nur umleiten, wenn er bereits eingeloggt ist. Und wenn er es nicht getan hat, lass ihn zur Anmeldeseite durch. Das Hinzufügen dieses Anrufs zu meiner Route wird den Benutzer blockieren, wenn er nicht bereits angemeldet ist. Dies macht die Anmeldung praktisch unmöglich. – QuikProBroNa

1

Sie so etwas wie dieses benötigen:

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

Können Sie bitte Ihre Antwort löschen, damit ich diese doppelte Frage löschen kann? – QuikProBroNa