2017-01-09 26 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)但这只是我。

如果有人有更好的解决方案请发帖,因为我不是真的感觉这个代码。

感谢。