2017-05-28 7 views
0

Ich mache eine Webanwendung, die Socket.io verwendet, um Informationen zwischen dem Server und dem Client zu übergeben, ein Beispiel sind Anmeldeinformationen. Die Dokumentation für passport.authenticate sagt es wie so zu verwenden:So übergeben Sie Benutzerdaten explizit an pass.authenticate

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

jedoch meine Webapp verwendet Polymer clientseitige Routing, so dass der einzige Weg meine index.js hat, ist dies:

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

Stattdessen würde Ich mag so etwas tun:

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

dies ist jedoch nicht wie die authenticate Funktion auch jetzt nicht aufgerufen wird. Gibt es eine Möglichkeit, einen Pass in einem solchen Szenario funktionieren zu lassen?

Antwort

0

Sie können Ihren benutzerdefinierten Rückruf mit passport.authenticate() definieren. Ich habe unten ein Beispiel gegeben, das möchten Sie vielleicht ausprobieren. Go here für weitere Informationen.

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

Update: Problem mit früherem Code war, wenn benutzerdefinierte Rückrufe im Pass mit authentifizieren verwendet es req Objekt aus dem Verschluss, der in diesem Fall nicht definiert wurde, da es nicht im Router war. Ich denke, jetzt, da Sie genug Authentifizierungsdaten über req.body bereitstellen können, sollte es funktionieren.

+0

Das obige Beispiel gibt einen undefinierten Fehler für req. –

+0

Bitte versuchen Sie die aktualisierte Antwort. – Tolsee

0

Sie können etwas wie unten versuchen. Definieren und benötigen Sie in Ihren Routen das Socket-Modul, damit Sie es in Routen verwenden können.

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

Hoffe, das hilft.

Verwandte Themen