Skip to content

Instantly share code, notes, and snippets.

@chad3814
Created May 23, 2012 23:39
Show Gist options
  • Save chad3814/2778491 to your computer and use it in GitHub Desktop.
Save chad3814/2778491 to your computer and use it in GitHub Desktop.
problem with passportjs
passport.use('twitter', new TwitterStrategy({
consumerKey: config.tw_consumer_key,
consumerSecret: config.tw_secret,
callbackURL: config.base_url + '/twitter/callback'
}, function (token, token_secret, profile, done) {
// twitter callback comes here to get the twuser obj
log.info('got twitter profile:', profile);
var TWUser = require('../models/twuser');
// find the twitter obj if it exists
db.findTWUser({providerid: profile.id}, function (err, doc) {
if (err) {
done(err, null);
return;
}
var twuser;
if (!doc) {
// create a new twitter obj
twuser = new TWUser(profile, token, token_secret);
db.saveTWUser(twuser.pack(), function (err, doc) {
if (err) {
done(err, null);
return;
}
twuser = TWUser.unpack(doc);
done(null, twuser);
});
}
// unpack doc into obj
twuser = TWUser.unpack(doc);
done(null, twuser);
});
}));
passport.use('facebook', new FacebookStrategy({
clientID: config.fb_appid,
clientSecret: config.fb_secret,
callbackURL: config.base_url + '/facebook/callback'
}, function (access_token, refresh_token, profile, done) {
// facebook callback comes here to get the fbuser obj
var FBUser = require('../models/fbuser');
db.findFBUser({providerid: profile.id}, function (err, doc) {
if (err) {
done(err, null);
return;
}
var fbuser;
if (!doc) {
// creata new fbuser obj
fbuser = new FBUser(profile, access_token);
db.saveFBUser(fbuser.pack(), function (err, doc) {
if (err) {
done(err, null);
return;
}
fbuser = FBUser.unpack(doc);
done(null, fbuser);
});
}
// unpack the doc into the obj
fbuser = FBUser.unpack(doc);
done(null, fbuser);
});
}));
var app = express.createServer();
app.set('view engine', 'jade');
app.use(weblog.logger);
// to catch favicon.ico; should improve
app.use('/', express.static(__dirname + '/public'));
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(express.session({
secret: config.SESSION_SECRET,
store: session_store
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
app.use(app.router);
app.get('/facebook', passport.authorize('facebook', {
scope: 'email'
}));
app.get('/twitter', passport.authorize('twitter'));
app.get('/facebook/callback', passport.authorize('facebook', {failureRedirect: '/reg'}), function (req, res) {
weblog.error("successful fb callback, req.account:", req.account);
res.render('reg.jade', {
account: req.account,
provider: 'fb'
});
});
app.get('/twitter/callback', passport.authorize('twitter', {failureRedirect: '/reg'}), function (req, res) {
weblog.info("successful tw callback, req.account:", req.account);
res.render('reg.jade', {
account: req.account,
provider: 'tw'
});
});
app.post('/register', function (req, res) {
log.info("reg post, req.body:", req.body);
var User = require('../models/user');
var FBUser = require('../models/fbuser');
var TWUser = require('../models/twuser');
// at this point we have the user info in the body
var user = new User(req.body.email, req.body.first, req.body.last);
var findFunc = null; // finding the twuser or fbuser is the same process, this is the db function to find it
if (req.body.provider === 'fb') {
findFunc = delegate(db, db.findFBUser);
} else if (req.body.provider === 'tw') {
findFunc = delegate(db, db.findTWUser);
} else {
res.render(500);
return;
}
findFunc({providerid: req.body.pid}, function (err, provider_doc) {
log.info("inside findFBUser");
if (err) {
log.info('failed to find the provider doc:', err);
res.end(err);
return;
}
if (req.body.provider === 'fb') {
user.fbid = provider_doc._id;
} else if (req.body.provider === 'tw') {
user.twid = provider_doc._id;
}
// save the user
db.saveUser(user.pack(), function (err, doc) {
log.info('user saved, doc:', doc);
if (err) {
log.info('error:', err);
res.end(err);
return;
}
user = User.unpack(doc);
if (user.hasError()) {
log.info('user error:', user);
res.end(user._err);
return;
}
// save the password
db.setHashedPassword(user, req.body.password, function (err) {
if (err) {
res.end(err);
return;
}
req.user = user;
log.info('successfully created account:', user);
res.redirect('/');
});
});
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment