2017-01-16 2 views
0

Ich habe bereits mehrere Antworten hier auf Stackoverflow überprüft, und ging auch auf die Dokumentation, aber ich kann immer noch nicht herausfinden, was das Problem sein könnte. In meiner Anwendung verwende ich SequelizeJS, um auf meine mySQL-Datenbank zuzugreifen, und jetzt versuche ich, meine REST-API-Endpunkte mit PassportJS mithilfe der JWT-Strategie zu sichern.Req.user ist undefiniert, wenn PassportJS, SequelizeJS und JWT Tokens verwenden

./app.js

// ... 
// passport 
app.use(passport.initialize()); 
require('./config/passport')(passport); 
// ... 

./config/passport.js

var passport  = require('passport'); 
var passportJwt = require('passport-jwt'); 
var models  = require('../models'); 
var config  = require('./config'); 

var ExtractJwt = passportJwt.ExtractJwt; 
var Strategy = passportJwt.Strategy; 

module.exports = function(passport) { 
    var params = { 
     secretOrKey: config.jwt.secret, 
     jwtFromRequest: ExtractJwt.fromAuthHeader() 
    }; 

    passport.use(new Strategy(params, function(jwt_payload, done) { 
     models.User.findOne({ 
      where: { 
       id: jwt_payload.id 
      } 
     }).then(
      function(user) { 
       if (user) { 
        done(null, user); 
       } else { 
        done(null, false); 
       } 
      }, 
      function(err) { 
       return done(err, false); 
      } 
     ); 
    })); 
}; 

Ich versuche, die Benutzereinheit aus der Anforderung dieser einfachen Weg zu bekommen:

var router = express.Router(); 
// ... 
router.route('/user/me', passport.authenticate('jwt', { session: false })) 
    .get(function(req, res) { 
     console.log(req.user); 
     res.json(req.user); 
    }); 

Ich habe bereits eine andere Route erstellt, die ein JWT-Token basierend auf dem angegebenen Benutzernamen und Passwort zurückgibt. Als ich den /user/me Endpunkt nennen lege ich die JWT-Token in die Header, zum Beispiel:

Authorization: JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MX0.M9z3iWNdjAu4THyCYp3Oi3GOWfRJNCYNUcXOw1Gd1Mo 

Also, mein Problem ist, dass, wenn ich den /user/me Endpunkt mit einem Token nenne, wird die req.user undefiniert sein und ich kann nicht verstehen es heraus, was der Grund ist.

Vielen Dank im Voraus für Ihre Hilfe!

+0

Nur um sicher zu machen, haben Sie überprüfen, was Ihr Modell Suchbegriff kehrt? Ich meine den Benutzer in .then() -Funktion –

+0

Ich weiß nicht, wie kann ich die Abfrage innerhalb der Strategie überprüfen, aber ich mit einem fest codierten {ID: 1} -Filter ausgeführt und es funktioniert gut. Es gibt ein JSON-Objekt zurück. – peetya

Antwort

2

Ihre Routendefinition scheint falsch zu sein: router.route akzeptiert keine Middleware in ihrem zweiten Argument, so dass die Authentifizierung gar nicht stattfindet.

sollte es sein smth wie

var router = express.Router(); 
// ... 
router.route('/user/me') 
    .all(passport.authenticate('jwt', { session: false })) 
    .get(function(req, res) { 
     console.log(req.user); 
     res.json(req.user); 
    }); 
+0

Vielen Dank, Schande über mich :) – peetya

Verwandte Themen