tracman-server/config/auth.js

89 lines
3.0 KiB
JavaScript
Raw Normal View History

2016-03-31 17:06:21 -06:00
var passport = require('passport'),
2016-06-12 18:18:34 -06:00
crypto = require('crypto'),
2016-03-31 17:06:21 -06:00
secret = require('./secrets.js'),
User = require('./models/user.js'),
GoogleStrategy = require('passport-google-oauth2').Strategy,
GoogleTokenStrategy = require('passport-google-id-token');
passport.use(new GoogleStrategy({
clientID: secret.googleClientId,
clientSecret: secret.googleClientSecret,
callbackURL: secret.url+'/auth/google/callback',
passReqToCallback: true
}, function(req, accessToken, refreshToken, profile, done) {
2016-06-30 14:40:21 -06:00
// Check for user
2016-03-31 15:01:27 -06:00
User.findOne({googleID: profile.id}, function(err, user){
2016-06-30 14:40:21 -06:00
// error
if (err) { console.log('Error finding user with google ID: '+profile.id+'\n'+err); }
// User found
if (!err && user !== null) {
2016-03-31 17:06:21 -06:00
if (!user.name) {
user.name = profile.displayName;
}
user.lastLogin = Date.now();
user.save(function (err, raw) {
2016-03-31 15:01:27 -06:00
if (err) { throwErr(req,err); }
2016-03-31 17:06:21 -06:00
});
done(null, user);
2016-06-30 14:40:21 -06:00
}
// User not found
else {
if (req.session.passport) /* create new user */ {
2016-05-02 00:05:58 -06:00
User.findById(req.session.passport.user, function(err,user){
2016-04-27 15:23:04 -06:00
if (err) {
2016-04-27 15:14:32 -06:00
console.log('Error finding invited user with passport session ID: '+req.session.passport.user+'\n'+err);
var failMessage = 'Something went wrong finding your session. Would you like to <a href="/bug">report this error</a>?'; }
else {
2016-05-02 00:05:58 -06:00
user.googleID = profile.id;
user.lastLogin = Date.now();
2016-06-12 18:18:34 -06:00
crypto.randomBytes(32, function(err,buf) {
if (err) {console.log('Unable to get random bytes:',err);}
if (!buf) {console.log('Unable to get random buffer');}
else {
user.sk32 = buf.toString('hex');
user.save(function(err) {
if (err) {
console.log('Error saving new (invited) user '+err);
var failMessage = 'Something went wrong finding your session. Would you like to <a href="/bug">report this error</a>?';
} else { successMessage = 'Your account has been created. Next maybe you should download the <a href="/android">android app</a>. ' }
done(null, user, { success:successMessage, failure:failMessage });
});
}
2016-05-02 00:05:58 -06:00
});
}
2016-03-31 17:06:21 -06:00
});
2016-06-30 14:40:21 -06:00
}
else /* user wasn't invited */ {
2016-03-31 17:06:21 -06:00
done(null,false, {error: 'User not found. Maybe you want to <a href="#" data-scrollto="get">request an invite</a>? '});
}
2016-06-30 14:40:21 -06:00
2016-03-31 17:06:21 -06:00
}
2016-06-30 14:40:21 -06:00
2016-03-31 17:06:21 -06:00
});
2016-06-30 14:40:21 -06:00
2016-03-31 17:06:21 -06:00
}));
2016-03-31 15:01:27 -06:00
2016-03-31 17:06:21 -06:00
passport.use(new GoogleTokenStrategy({
2016-05-31 21:54:21 -06:00
clientID: secret.googleClientId
2016-03-31 17:06:21 -06:00
}, function(parsedToken, googleId, done) {
User.findOne({googleID:googleId}, function(err, user) {
2016-04-27 15:14:32 -06:00
if (err) {
console.log('Error finding user for gToken login with google profile ID: '+googleId+'\n'+err); }
2016-03-31 17:06:21 -06:00
if (!err && user !== null) { // Log in
user.lastLogin = Date.now();
user.save(function (err) {
2016-04-27 15:14:32 -06:00
if (err) {
console.log('Error saving user\'s lastLogin for gToken login with google profile ID: '+googleId+'\n'+err); }
2016-03-31 17:06:21 -06:00
});
return done(err, user);
} else { // No such user
done(null, false);
}
});
}));