Skip to content

Instantly share code, notes, and snippets.

@glynnbird
Last active November 16, 2016 15:36
Show Gist options
  • Save glynnbird/f73add0afe3040d3fcb11a09d4a91ad8 to your computer and use it in GitHub Desktop.
Save glynnbird/f73add0afe3040d3fcb11a09d4a91ad8 to your computer and use it in GitHub Desktop.
Cloudant Envoy Twitter authentication - step 2
var path = require('path'),
express = require('express'),
uuid = require('uuid'),
cloudant = null,
cfenv = require('cfenv'),
appEnv = cfenv.getAppEnv(),
appurl = (appEnv.app.application_uris)?'https://'+appEnv.app.application_uris[0]:'http://localhost:'+appEnv.port,
router = express.Router();
var getOrCreateUser = function(profile, callback) {
var user_id = parseInt(profile.id).toString(36);
var name = profile.displayName;
envoy.auth.getUser(user_id, function (err, data) {
if (err) {
var meta = {
user_id: user_id,
name: name
};
console.log("created new user", meta);
envoy.auth.newUser(user_id, password, meta, function (err, data) {
envoy.auth.getUser(user_id, function(err, data) {
callback(err, data);
});
})
} else {
console.log("User already exists", data);
callback(err, data);
}
});
};
// passport
var passport = require('passport'),
TwitterStrategy = require('passport-twitter').Strategy;
var opts = {
consumerKey: process.env.TWITTER_API_KEY,
consumerSecret: process.env.TWITTER_API_SECRET,
callbackURL: appurl + '/_twitter/callback'
};
passport.use(new TwitterStrategy(opts , function(accessToken, refreshToken, profile, done) {
getOrCreateUser(profile, done);
}));
router.get('/_twitter', passport.authenticate('twitter', {session: false}));
router.get('/_twitter/callback', passport.authenticate('twitter', {session: false}), function(req, res) {
var data = req.user;
data._id = uuid.v4();
data.ts = new Date().getTime() + 1000*60*60;
delete data._rev;
tokensdb.insert(data, function (err, data) {
res.redirect('/#?token=' + data.id)
});
});
// setup Envoy to
// - switch off demo app
// - serve out our static files
// - add our routes & middleware
var opts = {
production: true,
static: path.join(__dirname, './public'),
router: router,
middleware: [ passport.initialize() ]
};
// start up the web server
var envoy = require('cloudant-envoy')(opts);
envoy.events.on('listening', function() {
console.log('[OK] Server is up');
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment