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: