2017-05-28 6 views
0

私は、Socket.ioを使ってサーバとクライアントの間で情報を渡すwebappを作っています。その一例はログイン情報です。明示的にpassport.authenticateにユーザデータを渡す方法

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

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

しかし、私のindex.jsが持っている唯一のルートので、私のwebappのポリマークライアント側のルーティングを使用しているが、これです:passport.authenticateのドキュメントはそうのようにそれを使用することを言います

代わりに、私はこのような何かをしたい:認証機能がさえ今呼び出されませんよう

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

希望します。

関連する問題