Skip to content

Instantly share code, notes, and snippets.

@UlisesGascon
Last active December 27, 2017 12:08
Show Gist options
  • Save UlisesGascon/16c2e83d06d4489d58623dac9d4139ba to your computer and use it in GitHub Desktop.
Save UlisesGascon/16c2e83d06d4489d58623dac9d4139ba to your computer and use it in GitHub Desktop.
Pillars, Passport with Local and Facebook. Thanks to @bifuer & @lilxelo
// Passport requires
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var FacebookStrategy = require('passport-facebook').Strategy;
// Passport Local strategy
passport.use(new LocalStrategy(
function(username, password, done) {
if(username == "user" && password=="pass"){
return done(null, {name:"Homer", id:123456});
} else {
return done(null, false);
}
}
));
// Passport Facebook strategy
var FACEBOOK_APP_ID = "";
var FACEBOOK_APP_SECRET = "";
var FACEBOOK_CALLBACK = "http://localhost:3000/passport/facebook";
passport.use(new FacebookStrategy({
clientID: FACEBOOK_APP_ID,
clientSecret: FACEBOOK_APP_SECRET,
callbackURL: FACEBOOK_CALLBACK
},function(accessToken, refreshToken, profile, done) {
done(null, profile);
}
));
// Passport session serialize (RAW)
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(id, done) {
done(null, id);
});
// Pillars require
var project = require('../pillars/index.js').configure({
debug: true,
renderReload: true
});
// Setup default HTTP service
project.services.get('http').configure({timeout:8000,port:3000}).start();
// Apply classic Connect middleware as Pillars middleware (Basic, only naming middleware)
project.middleware.add(Middleware({id:"passportInitialize"},passport.initialize()));
project.middleware.add(Middleware({id:"passportSession"},passport.session()));
// Create new Route container
var PassportCtrl = Route({
id: 'passport',
path:'/passport',
method:["get"],
session: true // All sub-routes inherited session support
},
function(gw){
// Show links to login options:
gw.html(
'<a href="/passport/local">Local login</a>'+
'<a href="/passport/facebook">Facebook login</a>'
);
}
);
// Login success, shows the session.
PassportCtrl.routes.add(Route({
path:'/view-session',
session: true
}, function(gw){
gw.json(gw.session,{deep:0});
}));
// Passport local strategy form
PassportCtrl.routes.add(Route({
id: 'local',
path:'/local',
method:["get"]
},
function(gw){
gw.html(
'<form action="locallogin" method="post">'+
'<div>'+
'<label>Username:</label>'+
'<input type="text" name="username"/>'+
'</div>'+
'<div>'+
'<label>Password:</label>'+
'<input type="password" name="password"/>'+
'</div>'+
'<div>'+
'<input type="submit" value="Log In"/>'+
'</div>'+
'</form>');
}));
// Passport local strategy receiver
PassportCtrl.routes.add(Route({
id: 'local',
path:'/locallogin',
method:["post"]
},
// Add strategy middleware
passport.authenticate('local',{successRedirect: '/passport/view-session', failureRedirect: '/passport/local?error=local' })
));
// Passport Facebook strategy login controller
PassportCtrl.routes.add(Route({
id: 'facebook',
path:'/facebook',
method:["get"]
},
// Add strategy middleware
passport.authenticate('facebook',{ successRedirect: '/passport/view-session', failureRedirect: '/passport?error=facebook' })
));
// Finally add the Passport controller to the project
// You can create a Passport login system and encapsulate as only one Route/Component, and use on any project.
project.routes.add(PassportCtrl);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment