2017-01-09 6 views
0

Ich bekomme Benutzerobjekt nicht zur nächsten Middleware nach passport.authenticate('local', {session: false}) Middleware erfolgreich übergeben.Koa v2, Benutzerobjekt nach Pass-Loca Login

So sieht mein Code aus.

Im Pass Lokale Strategie

passport.use(new localStrategy((username, password, done) => { 
 

 
    User.findOne({username}, (err, user) => { 
 
     
 
     if(err) { return done(err) } 
 

 
     if(!user) { return done(err) } 
 

 
     user.comparePasswords(password, async(err, isMatch) => { 
 

 
      if(!isMatch) { return done(null, false) } 
 

 
      done(null, user); 
 
     }); 
 
    }); 
 
}));

die ich denken ist wohl das Benutzerobjekt zurück, wenn Login erfolgreich durchgeführt wird.

Da ist in meinem Routen Ich habe

const requireAuth = passport.authenticate('local', {session: false}); 
 

 
router.post('/login', requireAuth, signIn);

Wie wenn ich traf /signin der Pass-Middleware genannt wird und dann, wenn es signIn Middleware getan wird etwas namens ich erwarte ,mit meinem angemeldeten Benutzerobjekt.

Aber wenn ich überprüfe, in meinem Signin Middleware nichts übergeben wird (In Anforderung oder Antwort) Objekt.

Hier ist meine Signin Middleware

const signIn = async (ctx, next) => { 
 
    const res = ctx.response; 
 
    const req = ctx.request; 
 

 
    console.log('response', res); //- Nothing from passport 
 
    console.log('request', req); //- Nothing from passport 
 
    await next(); 
 
};

Ich brauche die protokolliert passiere in Benutzern von Pass in der nächsten Middleware, damit ich den Benutzer-ID verwenden kann, um eine jwt zu machen.

Vielen Dank.

+0

Ich glaube nicht, const res = erwarten ctx.response; '&' const req = erwarten ctx.request; 'ist richtig, weil dies erwartet, dass die Anfrage und Antwort Objekte im Kontext Versprechen noch ausgeführt werden, aber Ich denke nicht, dass das der Fall ist, oder? –

+0

@OvidiuDolha nein, es ist nicht, ich versuchte es auf die normale Weise (ohne 'wartet ') herum, aber das hat auch nicht funktioniert. Lemme den Code beheben. – ArchNoob

Antwort

0

Ich habe es mit passReqToCallback arbeitet ich bin nicht sicher, ob dies obwohl der richtige Weg ist, Um die Anforderung Körper außer Kraft setzen, aber das ist, was diese App jetzt arbeiten hätte.

Hier ist meine passport.js Datei Die einzige Datei, die changned.

passport.use(new localStrategy(
 
    {passReqToCallback: true}, 
 
    async(req, username, password, done) => { 
 

 
    User.findOne({username}, (err, user) => { 
 
     
 
     if(err) { return done(err) } 
 

 
     if(!user) { return done(err) } 
 

 
     user.comparePasswords(password, async(err, isMatch) => { 
 

 
      if(!isMatch) { return done(null, false) } 
 

 
      req.body = user; 
 
      await done(null, user); 
 
     }); 
 
    }); 
 
}));

Ja, ich bin überschreiben meine req.body mit dem Benutzer von db erhalten.

Ich weiß ehrlich nicht, warum ich immer noch die done(null, user) halte ich könnte genauso gesagt done(null, true) aber das ist nur ich.

Wenn jemand eine bessere Lösung hat, bitte posten, denn ich bin nicht wirklich Gefühl diesen Code.

Danke.