jfromaniello/passport.socketio

When and how passport socket io get called ?

Closed this issue · 1 comments

Hello,

I'm building a website that require passportjs/express/passport socketio. Currently, I have issue in making passport socket io to work: the socketio doesn't get called.

I've follow the set up in the main page but I don't really understand how passport socket io (PSO) works. Does the PSO work only when user log in or when they just access the main page ?

Below is my code:

var express = require('express');
var path = require('path');
var port = process.env.PORT || 3000;
var logger = require('morgan');
var io = require('socket.io');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var users = require('./routes/users');
var Model = require('./routes/model');
var passport = require('passport');
var bcrypt = require('bcrypt-nodejs');
var LocalStrategy = require('passport-local').Strategy;
var session = require('express-session');
var passportSocketIo = require("passport.socketio");
var http = require('http');
var app = express();
var server = http.createServer(app);
var sio = io.listen(server);
var MySQLStore = require('connect-mysql')(session);
var options = {
config: {
user: 'root',
password: '123',
database: 'test'
}
};
var sessionStore = new MySQLStore(options);

passport.use(new LocalStrategy(
{
// set the field name here
usernameField: 'username',
passwordField: 'password',
passReqToCallback: true
},
function(req, username, password, done) {
if (!req.user) {
new Model.User({Username: username}).fetch().then(function(data) {
var user = data;
if(user === null) {
return done(null, false, {message: 'Invalid username or password'});
} else {
user = data.toJSON();
if(!bcrypt.compareSync(password, user.Password)) {
return done(null, false, {message: 'Invalid username or password'});
} else {
return done(null, user);
}
}
});
}
})
);

// view engine setup
//app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use(session({
store: sessionStore,
key: 'connect_id',
secret: 'supersecret',
resave: true,
saveUninitialized: true,
cookie: {
maxAge: 1_60_1000, //1 Hour,
expires: 1_60_1000,
} // time im ms
})
);

passport.serializeUser(function(user, done) {
done(null, user.ID);
});

passport.deserializeUser(function(id, done) {
new Model.User({ID: id}).fetch().then(function(user) {
done(null, user);
});
});

// passport initialization
app.use(passport.initialize());
app.use(passport.session());

app.get('/', routes.index);
app.get('/Cards', routes.Cards);
app.get('/Tavern', routes.Tavern);
app.get('/login', routes.loginget);
app.post('/login', routes.loginpost);
app.get('/signup', routes.signupget);
app.post('/signup', routes.signuppost);
app.get('/signout', routes.signOut);
app.use('/users', users);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});

//module.exports = app;
server.listen(port, function() {
console.log('\t :: Express :: Listening on port ' + port );
});
//var sio = io.listen(server);

sio.use('authorization', passportSocketIo.authorize({
passport: passport,
cookieParser: require('cookie-parser'),
key: 'connect_id',
secret: 'supersecret',
store: sessionStore,
success: onAuthorizeSuccess,
fail: onAuthorizeFail
}));

function onAuthorizeSuccess(data, accept){
console.log('successful connection to socket.io');
// If you use socket.io@1.X the callback looks different
accept();
}

function onAuthorizeFail(data, message, error, accept){
console.log('failed connection to socket.io:', data, message);
// If you use socket.io@1.X the callback looks different
// If you don't want to accept the connection
if(error)
accept(new Error(message));
// this error will be sent to the user as a special error-package
// see: http://socket.io/docs/client-api/#socket > error-object
}

sio.sockets.on("connection", function(socket){
console.log("user connected: ", socket.request.user);
});

Thank you.

Got it working.