【问题标题】:How to explicitly pass user data to passport.authenticate如何将用户数据显式传递给passport.authenticate
【发布时间】:2017-10-29 01:30:00
【问题描述】:

我正在制作一个使用 Socket.io 在服务器和客户端之间传递信息的 web 应用程序,例如登录信息。 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);
    });
});

但是,这不起作用,因为身份验证函数现在甚至都没有被调用。有没有办法让护照在这种情况下工作?

【问题讨论】:

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


    【解决方案1】:

    您可以尝试以下方法。 在您的路由中定义并要求 socket 模块,因此您可以在路由中使用它。

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

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      您可以使用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 提供足够的身份验证数据,它应该可以工作。

      【讨论】:

      • 上面的例子,req会给出未定义的错误。
      猜你喜欢
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      • 2016-06-28
      • 1970-01-01
      • 2017-03-13
      相关资源
      最近更新 更多