如何将用户数据显式传递给passport.authenticate

时间:2017-05-28 18:27:39

标签: express socket.io polymer passport.js passport-local

我正在制作一个使用Socket.io在服务器和客户端之间传递信息的webapp,其中一个例子是登录信息。 passport.authenticate的文档说如何使用它:

app.post('/login', passport.authenticate('local', { successRedirect: '/',
    failureRedirect: '/login' }));

但是,我的webapp正在使用Polymer客户端路由,因此我的index.js唯一的路由就是:

app.get('*', function (req, res) {
    res.sendFile('./public/index.html', {root: '.'});
});

相反,我想做这样的事情:

io.on('connection', function(socket){
    socket.on('login', function(data){
        passport.authenticate('local', data);
    });
});

但是,由于验证功能现在甚至无法调用,因此无法正常工作。有没有办法让护照在这种情况下工作?

2 个答案:

答案 0 :(得分:0)

您可以使用passport.authenticate()定义自定义回调。我在下面给出了一个例子,你可能想尝试一下。转到here了解更多信息。

io.on('connection', function(socket){
    socket.on('login', function(data){
        var req = {}
        req.body = data 
        passport.authenticate('local', function(err, user, info) {
           if (err) { 
               socket.emit('login', { success: false });
           }
           if (!user) { 
               socket.emit('login', { success: false }); 
           }
           // Set session
           req.logIn(user, function(err) {
               if (err) { 
                   socket.emit('login', { success: false });
               }
               socket.emit('login', { success: true });
           });
    });
});

更新:以前代码的问题是,当在护照身份验证中使用自定义回调时,它使用来自闭包的req对象,在这种情况下是未定义的,因为它不在路由器中。我认为,既然您可以通过req.body提供足够的身份验证数据,那么它应该可行。

答案 1 :(得分:0)

您可以尝试以下内容。 在您的路由中定义并要求套接字模块,因此您可以在路由中使用它。

var express = require('express');
var app = express();
var server = http.createServer(app);
var io = require('socket.io').listen(server);
var router = express.Router();
var passport = require('passport');

io.on('connection', function(socket){
  socket.on('login', function(data){
       // call the routes 
       router.post('/login', function(request, response, next) {
          passport.authenticate('local', function(err, user, info) {
             if (err) {
              // return next(err);
              socket.emit('loginResult', { success: false });
             }
            if (!user) {
               var message = "Invalid credentials";
               socket.emit('loginResult', { success: false , message: message});
            }
            request.logIn(user, function (err) {
            if (err) {
               socket.emit('loginResult', { success: false });
            }
           // if want to save user in session
            request.session.user = user;
            // after success code
           socket.emit('loginResult', { success: true , user : user});
         });
       })(request, response, next);
     });
   });
});

希望这有帮助。