diff --git a/.gitignore b/.gitignore index 9fc7239..8b29088 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .DS_Store -/node_modules \ No newline at end of file +/node_modules +.env \ No newline at end of file diff --git a/app.js b/app.js index 1a00b4d..cd0e38e 100644 --- a/app.js +++ b/app.js @@ -29,6 +29,41 @@ app.use(express.static(__dirname + '/public')); // Setting up the Passport Strategies require("./config/passport")(passport) -// Add code here: + +app.get('/', function(req, res){ + res.render('layout', {user: req.user}); +}); + +// FACEBOOK +app.get('/auth/facebook', passport.authenticate('facebook', { scope: 'email'} )); +app.get('/auth/facebook/callback', + passport.authenticate('facebook', { + successRedirect: '/', + failureRedirect: '/' + }) +); + +// TWITTER +app.get('/auth/twitter', passport.authenticate('twitter', { scope: 'email'} )); +app.get('/auth/twitter/callback', + passport.authenticate('twitter', { + successRedirect: '/', + failureRedirect: '/' + }) +); + +// GOOGLE +app.get('/auth/google',passport.authenticate('google', { scope: 'email' } )); +app.get('/auth/google/callback', + passport.authenticate('google', { + successRedirect: '/', + failureRedirect: '/' + }) +); + +app.get("/logout", function(req, res){ + req.logout() + res.redirect("/") +}) app.listen(3000); diff --git a/config/passport.js b/config/passport.js index e69de29..ff1a19c 100644 --- a/config/passport.js +++ b/config/passport.js @@ -0,0 +1,117 @@ +var User = require('../models/user'); +var FacebookStrategy = require('passport-facebook').Strategy; +var TwitterStrategy = require('passport-twitter').Strategy; +var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy; + + + +module.exports = function(passport){ + passport.serializeUser(function(user, done) { + done(null, user._id); + }); + + passport.deserializeUser(function(id, done) { + User.findById(id, function(err, user) { + console.log('deserializing user:',user); + done(err, user); + }); + }); + + passport.use('google', new GoogleStrategy({ + clientID : process.env.GOOGLE_API_KEY, + clientSecret : process.env.GOOGLE_API_SECRET, + callbackURL : "http://localhost:3000/auth/google/callbacK" + },function(token, tokenSecret, profile, done) { + + process.nextTick(function() { + + User.findOne({ 'gg.id' : profile.id }, function(err, user) { + if (err) return done(err); + if (user) { + return done(null, user); + } else { + + var newUser = new User(); + newUser.gg.id = profile.id; + newUser.gg.access_token = token; + newUser.gg.firstName = profile.displayName; + newUser.gg.email = profile.email; + + newUser.save(function(err) { + if (err) + throw err; + return done(null, newUser); + }); + } + + }); + }); + })); + + passport.use('twitter', new TwitterStrategy({ + consumerKey : process.env.TWITTER_API_KEY, + consumerSecret: process.env.TWITTER_API_SECRET, + callbackURL : "http://localhost:3000/auth/twitter/callback" + },function(token, tokenSecret, profile, done) { + + process.nextTick(function() { + + User.findOne({ 'tw.id' : profile.id }, function(err, user) { + if (err) return done(err); + if (user) { + return done(null, user); + } else { + + var newUser = new User(); + newUser.tw.id = profile.id; + + newUser.save(function(err) { + if (err) + throw err; + return done(null, newUser); + }); + } + + }); + }); + })); + + passport.use('facebook', new FacebookStrategy({ + clientID : process.env.FACEBOOK_API_KEY, + clientSecret : process.env.FACEBOOK_API_SECRET, + callbackURL : 'http://localhost:3000/auth/facebook/callback', + enableProof : true, + profileFields : ['name', 'emails'] + }, function(access_token, refresh_token, profile, done) { + + // // Use this to see the information returned from Facebook + // console.log(profile) + + process.nextTick(function() { + + User.findOne({ 'fb.id' : profile.id }, function(err, user) { + if (err) return done(err); + if (user) { + return done(null, user); + } else { + + var newUser = new User(); + newUser.fb.id = profile.id; + newUser.fb.access_token = access_token; + newUser.fb.firstName = profile.name.givenName; + newUser.fb.lastName = profile.name.familyName; + newUser.fb.email = profile.emails[0].value; + + newUser.save(function(err) { + if (err) + throw err; + // after this is saved it will create a variable in the user object + return done(null, newUser); + }); + } + + }); + }); + })); + +} \ No newline at end of file diff --git a/models/user.js b/models/user.js index e69de29..67293bf 100644 --- a/models/user.js +++ b/models/user.js @@ -0,0 +1,20 @@ +var mongoose = require('mongoose'); + +module.exports = mongoose.model('User',{ + // details from fb acct + fb: { + id: String, + access_token: String, + firstName: String, + lastName: String, + email: String + }, + tw: { + id: String, + access_token: String + }, + gg: { + id: String, + access_token: String + } +}); diff --git a/package.json b/package.json index 788a55d..3add903 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "morgan": "~1.0.0", "passport": "^0.2.0", "passport-facebook": "^2.0.0", - "passport-google-oauth": "~0.1.5" + "passport-google-oauth": "~0.1.5", + "passport-twitter": "^1.0.3" } } diff --git a/views/layout.ejs b/views/layout.ejs index e69de29..a7fc32d 100644 --- a/views/layout.ejs +++ b/views/layout.ejs @@ -0,0 +1,46 @@ + + + + Facebook authentication + + +

FACEBOOK LOGIN USING PASSPORT

+
+ <% if(user != undefined){ %> +

Below is the data sent by facebook

+
+        <%= user.fb %>
+      
+ Logout + <% } else { %> + Login with Facebook + <% } %> +
+ +

TWITTER LOGIN USING PASSPORT

+
+ <% if(user != undefined){ %> +

Below is the data sent by TWITTER

+
+        <%= user.tw %>
+      
+ Logout + <% } else { %> + Login with TWITTER + <% } %> +
+ +

GOOGLE LOGIN USING PASSPORT

+
+ <% if(user != undefined){ %> +

Below is the data sent by GOOGLE

+
+        <%= user.gg %>
+      
+ Logout + <% } else { %> + Login with GOOGLE + <% } %> +
+ + \ No newline at end of file