Está en la página 1de 21

Login social con Node.

js
Gestión de usuarios con PassportJS

Login Social con Node.js Comunidad Mejorando.la


¿Qué es PassportJS?

Middleware de autenticación para Node.js, que


facilita la autenticación y registro de
usuarios de una aplicación web.
http://passportjs.org
Login Social con Node.js
¿Qué necesitamos?

● Instalar Node.js
http://nodejs.org/download/
● Instalar MongoDB
https://www.mongodb.org/downloads

Login Social con Node.js


¡Comenzamos!
Creamos una estructura base de aplicación con el
framework Express
$ sudo npm install -g express
$ express passport-example
$ cd passport-example
$ npm install

Instalamos las dependencias que vamos a utilizar


$ npm install --save mongoose
$ npm install --save passport
$ npm install --save passport-twitter
$ npm install --save passport-facebook

Login Social con Node.js


Modelo usuario
models/user.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var UserSchema = new Schema({


name: String, provider:
String,
provider_id: {type: String, unique: true},
photo: String,
createdAt: {type: Date, default: Date.now}
}); var User = mongoose.model('User',
UserSchema);

Login Social con Node.js


Configuración de Passport
passport.js
var mongoose = require('mongoose');
var User = mongoose.model('User');
var TwitterStrategy = require('passport-twitter').Strategy;

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);
});
. . .

Login Social con Node.js


Configuración de Passport
(Twitter)
passport.js

Login Social con Node.js


. . .
passport.use(new TwitterStrategy({ consumerKey:
'TWITTER_CONSUMER_KEY', consumerSecret:
'TWITTER_CONSUMER_SECRET', callbackURL:
'/auth/twitter/callback'
}, function(accessToken, refreshToken, profile, done) {
User.findOne({provider_id: profile.id}, function(err, user) {
if(err) throw(err);
if(!err && user!= null) return done(null, user);

var user = new User({ provider_id:


profile.id, provider:
profile.provider, name:
profile.displayName, photo:
profile.photos[0].value
});
user.save(function(err) {
if(err) throw err;
done(null, user);
});
});
}));

Login Social con Node.js


Configuración de Passport
(Facebook)
passport.js

Login Social con Node.js


. . .
passport.use(new FacebookStrategy({ clientID:
'FACEBOOK_APP_CLIENT_ID',
clientSecret:
'FACEBOOK_APP_SECRET_ID', callbackURL:
'/auth/twitter/callback'
}, function(accessToken, refreshToken, profile, done) {
User.findOne({provider_id: profile.id}, function(err, user) {
if(err) throw(err);
if(!err && user!= null) return done(null, user);

var user = new User({ provider_id:


profile.id, provider:
profile.provider, name:
profile.displayName, photo:
profile.photos[0].value
});
user.save(function(err) {
if(err) throw err;
done(null, user);
});
});
}));

Login Social con Node.js


Mantener las API KEYs apartadas
del código fuente
config.js passport.js
. . . var var config = require(‘./config’);
config = { . . . passport.use(new TwitterStrategy({
twitter: { consumerKey: 'config.twitter.key',
key: ‘TWITTER_API_KEY’, consumerSecret: 'config.twitter.secret',
secret: ‘TWITTER_API_SECRET’ callbackURL: '/auth/twitter/callback'
}, . . . passport.use(new
facebook: { FacebookStrategy({ clientID:
id: ‘FACEBOOK_APP_ID’, 'config.facebook.id', clientSecret:
secret: ‘FACEBOOK_APP_SECRET’ 'config.facebook.secret', callbackURL:
'/auth/twitter/callback' . . .
}
}; module.exports =
config;

Login Social con Node.js


Conjuntando todo
app.js
// Rutas de Passport
app.get('/logout', function(req, res) {
req.logout();
res.redirect('/');
});
app.get('/auth/twitter', passport.authenticate
('twitter'));
app.get('/auth/facebook',
passport.authenticate ('facebook'));
app.get('/auth/twitter/callback', passport.
authenticate('twitter',
{ successRedirect: '/',
failureRedirect: '/login' }));
app.get('/auth/facebook/callback',
passport. authenticate('facebook', {
successRedirect: '/', failureRedirect:
'/login' })); ...

Login Social con Node.js


... var mongoose =
require('mongoose'); var passport =
require('passport');
require('./models/user');
require('./passport')(passport);

mongoose.connect('mongodb://localhost/passport-example',
function(err, res) {
if(err) throw err;
console.log('Conectado con éxito a la BD');
});

app.use(express.cookieParser());
app.use(express.urlencoded());
app.use(express.json());
app.use(express.methodOverride());
app.use(express.session({ secret: 'secretkey' }));

// Configuración de Passport
app.use(passport.initialize());
app.use(passport.session());
...

Registro de App en FB/TW


Acceder a la sección “Desarrolladores” de Facebook y Twitter para registrar
una App y adquirir un API Key y un API Secret
Login Social con Node.js
http://dev.twitter.com http://developers.facebook.com

Login Social con Node.js


Login Social con Node.js
Obtención de API Keys
(Twitter)

Login Social con Node.js


Obtención de API Keys
(Facebook)

Login Social con Node.js


Login Social con Node.js
Controlador de la vista principal
routes/index.js
Le indicamos que variables queremos que se visualicen en el HTML
exports.index = function(req, res){
res.render('index', { title:
'Passport-Example', user:
req.user
});
};

views/index.jade

Login Social con Node.js


else
if(user) ul
ul li
li a(href='auth/twitter') Login con Twitter
img(src="#{user.photo}") li
li Bienvenido #{user.name} a(href='auth/facebook') Login con Facebook
li
a(href='logout') Salir

¡Y voilá!
$ mongod &
$ node app.js

Login Social con Node.js


Código disponible en:
http://github.com/carlosazaustre/passportjs-example

¡Gracias!

Login Social con Node.js

También podría gustarte