2016-04-10 2 views
15

Ich lernte Tutorial von https://devdactic.com/restful-api-user-authentication-1/. Aber ich habe Fehler auf diesem TeilNodeJS jwtStrategy erfordert eine Funktion zum Abrufen von JWT aus Anfragen Fehler

passport.use(new JwtStrategy(opts, function(jwt_payload, done) 

Hier ist der Fehler, wenn ich Knoten laufen „server.js“

/home/chibi/Documents/connect/project/node_modules/passport-jwt/lib/strategy.js:39 
throw new TypeError('JwtStrategy requires a function to retrieve jwt f 
     ^
TypeError: JwtStrategy requires a function to retrieve jwt from requests (see option jwtFromRequest) 
at new JwtStrategy (/home/chibi/Documents/connect/project/node_modules/passport-jwt/lib/strategy.js:39:15) 
at module.exports (/home/chibi/Documents/connect/project/config/passport.js:10:16) 
at Object.<anonymous> (/home/chibi/Documents/connect/project/server.js:30:29) 
at Module._compile (module.js:456:26) 
at Object.Module._extensions..js (module.js:474:10) 
at Module.load (module.js:356:32) 
at Function.Module._load (module.js:312:12) 
at Function.Module.runMain (module.js:497:10) 
at startup (node.js:119:16) 
at node.js:902:3 

Was ist die Lösung?

+0

Dank für diesen Beitrag auch dieses Tutorial zu tun und bekam auch diesen Fehler – HappyCoder888

Antwort

38

Ich denke, Sie verwenden 'Passport-jwt' 2.0.0, die einige Bruchänderungen von v1.x.x hinzugefügt hat, die von dem Tutorial verwendet werden. In der opts müssen Sie eine andere Option übergeben jwtFromRequest, um es zu sagen, wo für JWT Nutzlast zu suchen.

var JwtStrategy = require('passport-jwt').Strategy, 
    ExtractJwt = require('passport-jwt').ExtractJwt; 
var opts = {}; 
opts.jwtFromRequest = ExtractJwt.fromAuthHeader(); 
opts.secretOrKey = config.secret; 
passport.use(new JwtStrategy(opts, function(jwt_payload, done) { 
    User.findOne({id: jwt_payload.id}, function(err, user) { 
     if (err) { 
      return done(err, false); 
     } 
     if (user) { 
      done(null, user); 
     } else { 
      done(null, false); 
      // or you could create a new account 
     } 
    }); 
})); 
+11

Für jeden, der die '' 'ExtractJwt.fromAuthHeader ist keine Funktion' '' Fehler, gibt es brechen Änderungen von Passport-JWT 2.0 auf 3.0 !. Sie sollten einen anderen Extraktor wie ** fromAuthHeaderAsBearerToken ** verwenden. Https://www.npmjs.com/package/passport-jwt#included-extractors eine Liste der Extraktoren. –

14

Vom official documentation, wenn von 2.x migrieren JWT auf 3.x verwenden, sollten Sie verwenden:

ExtractJwt.fromAuthHeaderWithScheme('jwt') 

anstelle der alten:

ExtractJwt.fromAuthHeader() 
+0

Ich habe die validierte Lösung zuvor verwendet, aber als ich ein neues Projekt gestartet habe, war mir nicht klar, dass ich 3.x benutzt habe, und diese Lösung hat mein Problem gelöst! –