2016-08-10 2 views
0

Ich benutze Passport-jwt Strategie für die Authentifizierung in Express-Projekt,passport.authenticate nicht ausgeführt auf einer Strecke

hier ist mt Pass-jwt config in diesem Verzeichnis: /config/passport.js

var JwtStrategy = require('passport-jwt') 
 
\t .Strategy, 
 
\t ExtractJwt = require('passport-jwt') 
 
\t .ExtractJwt; 
 

 
var User = require(__dirname + '/../models/user'); 
 
var config = require(__dirname+ '/database'); 
 

 
module.exports = function(passport) { 
 
    console.log("here: passport-jwt"); 
 
\t var opts = {} 
 
\t opts.jwtFromRequest = ExtractJwt.fromAuthHeader(); 
 
\t opts.secretOrKey = config.secret; 
 
\t passport.use(new JwtStrategy(opts, function(jwt_payload, done) { 
 
\t \t User.findOne({ 
 
\t \t \t id: jwt_payload.id 
 
\t \t }, function(err, user) { 
 
\t \t \t if (err) { 
 
\t \t \t \t return done(err, false); 
 
\t \t \t } 
 
\t \t \t if (user) { 
 
\t \t \t \t done(null, user); 
 
\t \t \t } else { 
 
\t \t \t \t done(null, false); 
 
\t \t \t } 
 
\t \t }); 
 
\t })); 
 
};

und auf dem Konto Route in /routes/account.js Verzeichnis ich nenne es so:

var passport = require('passport'); 
require(__dirname + '/../config/passport')(passport); 

router.post('/', passport.authenticate('jwt', { 
session: false 
}), function(req, res) { ... } 

aber das Problem ist Pass-Funktion für die Authentifizierung wird nicht ausgeführt. und "hier: Pass-jwt" wurde nicht gezeigt.

wo ist das Problem?

Antwort

0

Vor allem in app.js, Routen wie folgt erklärt werden müssen:

nach folgenden Zeilen:

var passport = require('passport'); 
app.use(passport.initialize()); 

Sie sollen füge diese Zeilen hinzu:

var account = require(__dirname + '/routes/account')(app, express, passport); 
app.use('/account', account); 

und in der Strecke selbst:

module.exports = function(app, express, passport) { 

    var router = express.Router(); 

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

     passport.authenticate('jwt', function(err, user) { 
     if (err) { 
       res.sendStatus(406); 
      } else { 
       if (!user) { 
        res.sendStatus(400); 
       } else {...} 
      } 
     }); 
     } 

    } 
} 

mein Fehler war, dass console.log("here: passport-jwt"); in der ersten Zeile des Moduls gelegt wird, aber in der Tat passport.use(..) Teil jedes Mal ausgeführt wird!

und das letzte, was war das findOne Teil in Pass config passport.use(...) Teil, wenn Sie ein neueres id in MongoDB verwenden möchten, sollten Sie _id statt id abfragen!

Also, der richtige Code ist:

User.findOne({ 
      _id: jwt_payload.id 
     }, function(err, user) { 
       ... 
      }); 
1

Vielleicht könnten Sie dies versuchen:

router.get('/', function(req, res) { 
    passport.authenticate('jwt', 
     { 
     session: false 
     }); 
}); 
+0

Ich habe versucht, dies aber das Problem ist immer noch da. und die Methode der Route ist Post (vielleicht ist es einen Unterschied machen). – Pourya8386