JedWatson / sydjs-site

SydJS Meetup Website
MIT License
535 stars 225 forks source link

Add support for Bitbucket/LinkedIn social login #40

Open spolyak opened 9 years ago

spolyak commented 9 years ago

It would be helpful to expand the passport social login SydJS website options to have service integrations for Bitbucket and LinkedIn.

macbroadcast commented 9 years ago

Cool :+1:

spolyak commented 9 years ago

yeah, I'm working on it... Trying to figure it out...

var async = require('async'),
    _ = require('underscore'),
    request = require('request');

var passport = require('passport'),
    passportBitbucketStrategy = require('passport-bitbucket').Strategy;

var keystone = require('keystone'),
    User = keystone.list('User');

var credentials = {
    consumerKey: process.env.BITBUCKET_CONSUMER_KEY,
    consumerSecret: process.env.BITBUCKET_CONSUMER_SECRET,
    callbackURL: process.env.BITBUCKET_CALLBACK_URL
};

exports.authenticateUser = function(req, res, next)
{
    var self = this;

    var redirect = '/auth/confirm';
    if (req.cookies.target && req.cookies.target == 'app') redirect = '/auth/app';

    // Begin process
    console.log('============================================================');
    console.log('[services.bitbucket] - Triggered authentication process...');
    console.log('------------------------------------------------------------');

    // Initalise Bitbucket credentials
    var bitbucketStrategy = new passportBitbucketStrategy(credentials, function(token, tokenSecret, profile, done) {
        done(null, {
            accessToken: token,
            refreshToken: tokenSecret,
            profile: profile
        });
    });

    // Pass through authentication to passport
    passport.use(bitbucketStrategy);

    // Save user data once returning from Bitbucket
    if (_.has(req.query, 'cb')) {

        console.log('[services.bitbucket] - Callback workflow detected, attempting to process data...');
        console.log('------------------------------------------------------------');

        passport.authenticate('bitbucket', { session: false }, function(err, data, info) {

            if (err || !data) {
                console.log("[services.bitbucket] - Error retrieving BitBucket account data - " + JSON.stringify(err));
                return res.redirect('/signin');
            }

            console.log('[services.bitbucket] - Successfully retrieved BitBucket account data, processing...');
            console.log('------------------------------------------------------------');

            //console.log(JSON.stringify(data));

            var name = data.profile && data.profile.displayName ? data.profile.displayName.split(' ') : [];

            var auth = {
                type: 'bitbucket',

                name: {
                    first: name.length ? name[0] : '',
                    last: name.length > 1 ? name[1] : ''
                },

                website: '', //data.profile._json.blog'',

                profileId: data.profile.id,

                username: data.profile.username,
                avatar: data.profile._json.avatar_url,

                accessToken: data.accessToken,
                refreshToken: data.refreshToken
            }

            req.session.auth = auth;

            return res.redirect(redirect);

        })(req, res, next);

    // Perform inital authentication request to Bitbucket
    } else {

        console.log('[services.bitbucket] - Authentication workflow detected, attempting to request access...');
        console.log('------------------------------------------------------------');

        passport.authenticate('bitbucket')(req, res, next);

    }

};
cantuket commented 9 years ago

Hi I was wondering if you ever got the LinkedIn login working? I'm about to try that myself.