Express 如何将用户数据显式传递给passport.authenticate
我正在制作一个webapp,它使用Socket.io在服务器和客户端之间传递信息,其中一个例子就是登录信息。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
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的未定义错误。