2016-11-13 4 views
1

Ich habe einen absoluten Albtraum versucht, JWT mit meiner Express-App einrichten! Ich denke, ich habe es jetzt am Laufen, ich habe eine Registrierungsroute und eine Login-Route, die beide korrekt funktionieren und gültige Token erzeugen und ich habe eine andere Route in meiner '/ Benutzer' Route, mit der ich die Authentifizierung teste und das ist alles in Ordnung. Aber ich habe eine andere Datei, die Routen für '/ api' enthält, wo die Authentifizierung tatsächlich wichtig ist und ich eine ähnliche Testroute habe, die versucht, auf req.user zuzugreifen (genau wie bei meiner anderen Route), aber es scheint wie req. Benutzer ist nicht definiert. Durch einige Debugging es wie der Benutzer ist in req.account sieht das sehr seltsam ist, und ich verstehe nicht, warum es nicht in req.userPassport JWT req.user ist in einer meiner Routen nicht definiert

ich in /config/passport.js meine jwt Strategie definieren

'use strict'; 
const User = require('../models/user'), 
     config = require('./main'), 
     JwtStrategy = require('passport-jwt').Strategy, 
     ExtractJwt = require('passport-jwt').ExtractJwt; 

//exported to be used by passport in server set up 
module.exports = function (passport) { 
    const jwtOptions = { 
    // Telling Passport to check authorization headers for JWT 
    jwtFromRequest: ExtractJwt.fromAuthHeader(), 
    // Telling Passport where to find the secret 
    secretOrKey: config.secret 
    }; 

    const jwtLogin = new JwtStrategy(jwtOptions, function(payload, done) { 
    User.findById(payload._id, function(err, user) { 
     if (err) { return done(err, false); } 

     if (user) { 
     done(null, user); 
     } else { 
     done(null, false); 
     } 
    }); 
    }); 

    passport.use(jwtLogin); 

} 

Pass wird als Argument an diese übergeben und dann in der Hauptexpressdatei initialisiert

hier ist die/Benutzer Routendatei, das funktioniert gut. eine GET-Anfrage an/users/isAuth mit Authorization-Header und ‚JWT‘ Senden funktioniert gut und ich meinen Benutzernamen an mich

"use strict"; 
const express = require('express'), 
     router = express.Router(), 
     jwt = require('jsonwebtoken'), 
     User = require('../models/user'), 
     config = require('../config/main'), 
     passport = require ('passport'); 

function generateToken(user) { 
    return jwt.sign({_id: user._id}, config.secret, { 
     expiresIn: 10080 
    }); 
} 
. 
. Here are routes for login and register they perform as expected 
. and work fine 
. 
/* ================================== 
     Test Authentication Route 
    ================================== */ 
router.get('/isAuth', passport.authenticate('jwt', { session: false }), function(req, res) { 
    console.log(req.user); 
    res.json({username: req.user.username}); 
}); 



module.exports = router; 

obwohl zurückkommen, für die api Routen In dieser Datei Senden einer Anfrage GET/api/testAuth genau das gleiche wie vorher mit dem gleichen Token und den gleichen Header Ich bekomme keine req.user zurück und in der Konsole sehe ich, dass req.user nicht definiert ist. Aber in der Konsole scheint das Benutzerobjekt genau wie req.account zu sein? Ich verstehe nicht, was hier passiert, hoffentlich kann jemand helfen!

"use strict"; 
const express = require('express'), 
     router = express.Router(), 
     jwt = require('jsonwebtoken'), 
     Server = require('../models/server'), 
     passport = require('passport'); 

// Test route to see if logged in user is matt 
router.get('/testAuth', passport.authorize('jwt', { session: false }), function(req, res) { 
    console.log(req.user); 
    if (req.user) { 
     if(req.user.username == "matt") { 
     res.send("You are matt!"); 
     } else { 
     res.send("You are not matt!"); 
     } 
    } else { 
     res.send("no req.user"); 
    } 

}) 

module.exports = router; 

Antwort

2

Du passport.authorize in Ihrer testAuth Route verwendet wird, ist dies für die Benutzer, die bereits angemeldet sind und Sitzungsinformationen haben. Da Sie nicht Sitzungsspeicher verwenden Sie haben keine persistente req.user Objekt und sollte so passport.authenticate auf allen Strecken verwenden

http://passportjs.org/docs/authorize

Verwandte Themen