2016-02-23 29 views
1

我正在尝试实现正常的登录和注册模块,但我在理解完成功能时遇到困难。 here是我觉得负责完成功能的行。现在我想要做的就是返回相应的消息,比如是否有服务器错误。了解PassportJS中的已完成功能

app.post('/user/auth/login', passport.authenticate('local-login'), function(req, res) { 
    console.log("Login Request Successful"); 
    if(req.user){ 
     res.status(200).send(JSON.stringify({ 
      'msg' : "Successfully logged in" 
     })); 
    } 
    else{ 
     res.status(400) 
    } 
    //console.log(req.user); 
}); 

这是针对登录Passport后将用户对象附加到请求模块的情况。 但是,如何区分服务器错误和身份验证失败错误

这是我的身份验证中间件。

passport.use('local-login', new LocalStrategy({ 
    passReqToCallback: true 
}, function(req, username, password, done) { 

    Users.findOne({ 
     'emailId': username 
    }, function(err, user) { 
     if (err) 
      return done(err); 
     if (!user) 
      return done(null, false); 
     else if (passwordHash.verify(password, user.password)) { 
      console.log("User is verified"); 
      req.session.save(); 
      return done(null, user); 

     } else 
      return done(null, false); 
    }); 
})); 

基本上,我需要访问done()函数中的消息。我怎么做?

功能如何,就像我输入了错误的密码一样,在未经授权的浏览器中显示的消息。这意味着它将response.data字段设置为Unauthorized。而不是我想知道什么时候出现错误并想发送我的自定义消息。

回答

3

我不知道你是什么意思

访问意味着有()函数

消息,但是可以很好地与做过与信息提供另外的对象做回调

if (!user) { 
    return done(null, false, { 
       message: 'Unknown user or invalid password' 
    }); 
} 
if (!user.authenticate(password)) { 
    return done(null, false, { 
       message: 'Unknown user or invalid password' 
    }); 
} 
+0

不知何故在我的response.data角度消息字段不显示。任何可能的原因? –

+0

知道了... __useful显示一条提示用户再次尝试的Flash消息___。但我不希望它作为闪光消息,我想将其显示为烤面包机通知。 –

+0

它完全是你的电话如何显示消息:) –

0

另一种方法。 我不知道我是如何错过它的。在文档中有自定义回调选项。这是相同的实现。

app.post('/user/auth/login', function(req, res) { 
     passport.authenticate('local-login', function(err, user, info) { 
     if (err) { 
      res.status(500).send(JSON.stringify({ 
       'msg': "Internal Server Error" 
      })); 
     } 
     if (!user) { 
      res.status(401).send(JSON.stringify({ 
       'msg': "Username or Password is incorrect" 
      })); 
     } 
     if (user) { 
      res.status(200).send(JSON.stringify({ 
       'msg': "Successfully logged in" 
      })); 
     } 
    })(req, res, next); 
    }); 

该解决方案的唯一问题是您将不得不手动登录并创建会话等等。

  • 可选callback能够供给以允许overrride默认方式,其中验证尝试 处理的应用程序。该回调具有以下签名,其中user 将在成功的 身份验证尝试中设置为已通过身份验证的用户,否则将设置为false。将传递一个可选的info 参数,其中包含 策略的验证回调提供的其他详细信息。
app.get('/protected', function(req, res, next) { 
passport.authenticate ('local',function(err, user, info) { 
if (err) { return next(err) } 
if (!user) { return res.redirect('/signin') } 
res. redirect('/account'); 
})(req, res, next); 
}); 

注意,如果回调时,它会成为应用程序的责任,登录用户,建立会话,否则 执行所需的操作。

+0

有趣的是,但我试图回答你想这是第一次尝试的方式:) –