Tutorial: Autenticación de usuarios en Node.js con Facebook utilizando Passport

| 2016-07-5 | No hay comentarios »

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

twitter-card

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:

newapp-testface

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:

index

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”:

newapp-test

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

Descargar proyecto completo:

github-logo

Acerca del autor: Rodrigo Paszniuk

Ingeniero Informático, amante de la tecnología, la música, el ciclismo y aprender cosas nuevas.

Posts Relacionados

  • maxresdefault Tutorial: Autenticación basada en Token utilizando Node.js + Express.js + MongoDB
  • mean-stack-tutorial Tutorial: Crear una aplicación web utilizando MEAN
  • nodejs-express-mongo Tutorial: Crear API RESTful utilizando Node.js + Express.js + MongoDB
  • nodejs-and-express Archivos estáticos en Express.js