我正在制作一个使用Socket.io在服务器和客户端之间传递信息的webapp,其中一个例子是登录信息。 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);
});
});
但是,由于验证功能现在甚至无法调用,因此无法正常工作。有没有办法让护照在这种情况下工作?
答案 0 :(得分: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提供足够的身份验证数据,那么它应该可行。
答案 1 :(得分: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);
});
});
});
希望这有帮助。