El objetivo de este tutorial es utilizar passport para autenticar usuarios en una aplicación web utilizando MongoDB + Express + Node.

Estructura del proyecto
-- models
---- user.js
-- routes
---- index.js
-- passport.js
-- views
---- index.jade
-- server.js
-- package.json
Instalamos las dependencias que vamos a utilizar con el comando npm install.
Creamos un modelo user /models/user.js donde indicaremos que datos vamos a querer almacenar en la base de datos para nuestros usuarios:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
module.exports = mongoose.model('User', new Schema({
name: String,
provider: String,
provider_id: {type: String, unique: true},
createdAt: {type: Date, default: Date.now}
}));
Configuramos Passport /passport.js importando las librerías que utilizamos y las funciones que nos permiten el login.
Con seriealizeUser y deserializeUser logramos que el objeto usuario quede almacenado en la sesión de la aplicación y asi poder utilizarlo a lo largo de ella.
Con FacebookStrategy utilizamos las estrategias de autenticación que nos proporciona Passport, les pasamos como parámetros los API Key y API secret que nos dan las plataformas cuando registramos una aplicación en ellas, y nos devuelven varios objetos, entre ellos el objetoprofile que contiene toda la información del usuario que devuelve Facebook y del que podemos sacar los atributos que queramos para nuestra aplicación (nombre, id, etc…)
var mongoose = require('mongoose');
var User = mongoose.model('User');
var FacebookStrategy = require('passport-facebook').Strategy;
module.exports = function(passport) {
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(obj, done) {
done(null, obj);
});
passport.use(new FacebookStrategy({
clientID: 'FACEBOOK_APP_CLIENT_ID',
clientSecret: 'FACEBOOK_APP_SECRET_ID',
callbackURL: '/auth/facebook/callback'
}, function(accessToken, refreshToken, profile, done) {
console.log('token: '+accessToken+' '+profile.id+' '+profile.displayName);
User.findOne({provider_id: profile.id}, function(err, user) {
if(err) throw(err);
if(!err && user!= null){
console.log('user != null');
return done(null, user);
}
var user = new User({
provider_id: profile.id,
provider: profile.provider,
name: profile.displayName
});
user.save(function(err) {
if(err) throw err;
console.log('ok');
done(null, user);
});
});
El servidor Express (server.js) quedaría así:
var express = require('express');
var mongoose = require('mongoose');
var passport = require('passport');
var path = require('path');
var bodyParser = require('body-parser');
var methodOverride = require("method-override");
var app = express();
var cookieParser = require('cookie-parser');
var logger = require('morgan');
require('./models/user');
require('./passport')(passport);
var routes = require('./routes');
mongoose.connect('mongodb://localhost/passport',
function(err, res) {
if(err) throw err;
console.log('Conectado con éxito a la BD');
});
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
// configs
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(require('express-session')({
secret: 'keyboard cat',
resave: false,
saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(express.static(path.join(__dirname, 'public')));
// Routes
app.get('/', routes.index);
app.get('/logout', function(req, res) {
req.logout();
res.redirect('/');
});
app.get('/auth/facebook', passport.authenticate('facebook'));
app.get('/auth/facebook/callback', passport.authenticate('facebook',
{ successRedirect: '/',
failureRedirect: '/login' }));
// Start server
app.listen(3000, function() {
console.log("Node server running on http://localhost:3000");
});
Esta sería el archivo Jade que renderiza el index: /views/index.jade.
if(user)
ul
li Bienvenido #{user.name}
li
a(href='logout') Salir
else
ul
li
a(href='auth/facebook') Login con Facebook
El siguiente paso es crear una nueva aplicación en Facebook, para hacer eso deben de entrar a: https://developers.facebook.com, una vez creada la aplicación debería de quedar algo como esto:

Una vez que ya creamos toda la aplicación, vamos a configurar el arhivo passport.js con el id de la aplicación y clave secreta para que nuestra aplicación funcione.
Ahora probamos ejecutar nuestro servidor utilizando node server.js y el resultado debería de ser:

Le damos «Login con Facebook» y el resultado debería de ser el siguiente una vez que le demos click en el botón «Aceptar»:

Espero que les sea de utilidad el artículo, por más información de Passport ingresar aquí: Link!!
Descargar proyecto completo:

