2017-01-09 27 views
0

中間件成功通過passport.authenticate('local', {session: false})後,我無法將用戶對象獲取到下一個中​​間件。Koa v2,在護照 - loca登錄後獲取用戶對象

下面是我的代碼的樣子。

在護照本地策略

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); 
 
     }); 
 
    }); 
 
}));

我認爲是假設回報用戶對象,如果登錄成功建立。

然後在我的路線

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

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

,當我打/signin護照中間件被調用,然後當它這樣做signIn中間件被稱爲東西,我很期待,與我登錄的用戶對象

但是,當我在簽到檢查中間件不會傳送(在請求或響應)對象。

這裏是我的簽到中間件

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(); 
 
};

我需要從護照通過登錄的用戶到下一個中​​間件,所以我可以使用用戶ID來進行JWT。

謝謝。

+0

我不認爲'const res = await ctx.response;'&'const req = await ctx.request;'是正確的,因爲這需要上下文中的請求和響應對象承諾尚未執行,但我不認爲是這樣,是嗎? –

+0

@OvidiuDolha不,它不是,我以正常的方式嘗試(沒有「等待」),但那也沒有效果。 Lemme修復代碼。 – ArchNoob

回答

0

我得到它與passReqToCallback一起工作我不確定這是否是正確的方式,但要覆蓋請求主體,但這是什麼讓這個應用程序現在工作。

這是我的passport.js文件唯一的文件,改變

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); 
 
     }); 
 
    }); 
 
}));

是的,我重寫我的req.body從數據庫中獲得的用戶。

我真的不知道爲什麼我仍然保持done(null, user)我可以只說done(null, true)但這只是我。

如果有人有更好的解決方案請發帖,因爲我不是真的感覺這個代碼。

感謝。