diff options
| author | Jules Laplace <jules@okfoc.us> | 2014-06-06 11:39:24 -0400 |
|---|---|---|
| committer | Jules Laplace <jules@okfoc.us> | 2014-06-06 11:39:24 -0400 |
| commit | 2059be60461c1577324ab3b51d967e18aa2e700e (patch) | |
| tree | 3d41b2c48f28095fad84673454c8df6032eae5af /server/lib | |
| parent | 1cde3b9fd49e397a2106baca0f6bef378041589c (diff) | |
sign in with facebook / twitter
Diffstat (limited to 'server/lib')
| -rw-r--r-- | server/lib/auth.js | 110 | ||||
| -rw-r--r-- | server/lib/schemas/User.js | 3 |
2 files changed, 100 insertions, 13 deletions
diff --git a/server/lib/auth.js b/server/lib/auth.js index 04ab346..22917c3 100644 --- a/server/lib/auth.js +++ b/server/lib/auth.js @@ -1,48 +1,132 @@ /* jshint node: true */ var passport = require('passport'), + FacebookStrategy = require('passport-facebook').Strategy, + TwitterStrategy = require('passport-twitter').Strategy, + passportSocketIo = require("passport.socketio"), _ = require('lodash'), config = require('../../config.json'), User = require('./schemas/User'); var auth = { - login: function (method) { - return passport.authenticate(method); + init: function () { + passport.serializeUser(auth.serializeUser); + passport.deserializeUser(auth.deserializeUser); + + passport.use(new TwitterStrategy({ + consumerKey: process.env.VVALLS_TWITTER_KEY || '0L5blfBIapqhpons8bCXdIoGM', + consumerSecret: process.env.VVALLS_TWITTER_SECRET || '5EKW7m7inoODqYSKbp7cadBKFp1FghBl4MBDoXNcUjKtodZfuP', + callbackURL: 'http://' + config.host + '/auth/twitter/callback' + }, auth.insertTwitterUser)); + + passport.use(new FacebookStrategy({ + clientID: process.env.VVALLS_FACEBOOK_KEY || '719828821410310', + clientSecret: process.env.VVALLS_FACEBOOK_SECRET || 'f9aba78e08f37f621eadb88b1409d48c', + callbackURL: 'http://' + config.host + '/auth/facebook/callback', + enableProof: false, + }, auth.insertFacebookUser)); }, + + initSockets: function (io, cookieParser, SessionStore) { + io.set('authorization', passportSocketIo.authorize({ + cookieParser: express.cookieParser, + passport: passport, + key: 'vvalls.sid', // the name of the cookie where express/connect stores its session_id + secret: 'flibbertigibbet', // the session_secret to parse the cookie + store: SessionStore, // we NEED to use a sessionstore. no memorystore please + success: auth.socketSuccess, + fail: auth.socketFail, + })); + }, + + socketSuccess: function (data, accept) { + // console.error('successful connection to socket.io'); + accept(null, true); + }, + + socketFail: function (data, message, error, accept){ + if (error) { + throw new Error(message); + } + // console.log(data) + console.error('failed connection to socket.io:', message); + // We use this callback to log all of our failed connections. + accept(null, false); + }, + + // technically these returns the login middleware + login: function (strategy) { + return passport.authenticate(strategy); + }, + + loggedIn: function (strategy) { + return passport.authenticate(strategy, { + successReturnToOrRedirect: '/', + failureRedirect: '/login' + }); + }, + logout: function (req, res) { req.logout(); res.redirect('/'); }, serializeUser: function (user, done) { - done(null, user.twitter_id); + done(null, user._id); }, deserializeUser: function (id, done) { - User.findOne({ twitter_id: id }, "_id displayName username photo", function (err, user) { + User.findOne({ _id: id }, "_id displayName username photo", function (err, user) { done(err, user); }); }, - insertUser: function (accessToken, refreshToken, profile, done) { + insertTwitterUser: function (accessToken, refreshToken, profile, done) { process.nextTick(function () { var userData = { + twitter_id: profile.id, username: profile.username, displayName: profile.displayName, - photo: profile.photos[0].value + photo: profile.photos[0].value, + links: ["https://twitter.com/" + profile.username] }; - User.update({twitter_id: profile.id}, userData, {upsert: true}, function (userData, profile, err) { - return done(err, _.merge(userData, {twitter_id: profile.id})); - }.bind(this, userData, profile)); + + User.findOne({twitter_id: profile.id}, function(err, data){ + if (! err && data) { + return done(err, data); + } + new User(userData).save(function(err, data){ + if (err) { console.error(err) } + return done(err, data) + }) + }); + }); }, - loggedIn: function () { - return passport.authenticate('twitter', { - successReturnToOrRedirect: '/', - failureRedirect: '/login' + insertFacebookUser: function (accessToken, refreshToken, profile, done) { + console.log(profile) + process.nextTick(function () { + var userData = { + facebook_id: profile.id, + username: profile.username || profile.displayName.toLowerCase().replace(/ /g,'-'), + displayName: profile.displayName, + photo: "http://graph.facebook.com/" + profile.id + "/picture?type=large", + links: [profile.profileUrl] + }; + + User.findOne({facebook_id: profile.id}, function(err, data){ + if (! err && data) { + return done(err, data); + } + new User(userData).save(function(err, data){ + if (err) { console.error(err) } + return done(err, data) + }) + }); + }); }, diff --git a/server/lib/schemas/User.js b/server/lib/schemas/User.js index 1441631..9fd07e5 100644 --- a/server/lib/schemas/User.js +++ b/server/lib/schemas/User.js @@ -8,6 +8,8 @@ var mongoose = require('mongoose'), var UserSchema = new mongoose.Schema({ twitter_id: String, + facebook_id: String, + displayName: String, username: { type: String, @@ -26,6 +28,7 @@ var UserSchema = new mongoose.Schema({ case 'assets': case 'admin': case 'terms': + case 'assets': case '': return false } |
