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

Express 如何将用户数据显式传递给passport.authenticate,express,socket.io,polymer,passport.js,passport-local,Express,Socket.io,Polymer,Passport.js,Passport Local,我正在制作一个webapp,它使用Socket.io在服务器和客户端之间传递信息,其中一个例子就是登录信息。passport.authenticate的文档中说要像这样使用它: app.post('/login', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' })); 但是,我的webapp使用的是Polymer客户端路由,因此我的index.js唯一的路由是: app

我正在制作一个webapp,它使用Socket.io在服务器和客户端之间传递信息,其中一个例子就是登录信息。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);
    });
});

但是,这不起作用,因为现在甚至没有调用authenticate函数。有没有办法让passport在这种情况下工作?

您可以使用
passport.authenticate()
定义自定义回调。下面我举了一个例子,你可能想试试。去了解更多信息

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

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

您可以尝试下面的方法。 在路由中定义并要求套接字模块,以便您可以在路由中使用它

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

希望这有帮助。

上述示例将给出req的未定义错误。