2017-05-28 26 views
0

我正在製作一個使用Socket.io在web服務器和客戶端之間傳遞信息的webapp,其中一個例子是登錄信息。對於passport.authenticate文檔說使用它,像這樣:如何將用戶數據明確傳遞給passport.authenticate

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

然而,我的web應用程序是用高分子客戶端的路由,所以我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); 
    }); 
}); 

然而,這不起作用的身份驗證功能,甚至不被調用現在。在這種情況下有沒有辦法讓護照工作?

回答

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提供足夠的認證數據,它應該可以工作。

+0

上面的例子會給req提供未定義的錯誤。 –

+0

請嘗試更新的答案。 – Tolsee

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

希望這會有所幫助。