Una introducción rápida a OAuth con Passport.js

¿Qué es OAuth?

OAuth (Autorización abierta) es un protocolo de autorización. Una aplicación de terceros puede usarla para acceder a los datos del usuario desde un sitio (como Google o Twitter) sin revelar su contraseña. Sitios como Quora, Medium, AirBnb y muchos otros ofrecen autenticación mediante OAuth.

OAuth realmente simplifica nuestras vidas al eliminar la necesidad de recordar la contraseña de cada cuenta que crea en casi cualquier sitio. Solo tiene que recordar la contraseña de la cuenta principal de su proveedor de OAuth.

¿Qué es Passport.js?

Passport es un middleware que implementa la autenticación en aplicaciones web basadas en Express. Proporciona más de 500 estrategias. ¿Cuáles son estas estrategias? Las estrategias se utilizan para autenticar solicitudes. Cada estrategia tiene su propio paquete npm (como passport-twitter, passport-google-oauth20). Se debe configurar una estrategia antes de su uso.

¿Por qué utilizar Passport.js?

Aquí hay seis razones que indican por qué debería usar Passport:

  • Es ligero
  • Fácilmente configurable
  • Admite sesiones persistentes
  • Ofrece OAuth
  • Proporciona módulos separados para cada estrategia
  • Le brinda la capacidad de implementar estrategias personalizadas

Construyamos algo

Para comenzar, necesitamos instalar el pasaporte de NPM:

npm install passport 

Vamos a crear una aplicación simple que le otorga al usuario acceso a una ruta secreta solo si inicia sesión. Voy a utilizar la estrategia passport-google-oauth20 en este tutorial. Siéntase libre de usar cualquier otra estrategia que prefiera, pero asegúrese de consultar los documentos para ver cómo está configurada.

Antes de continuar, necesitamos un clientID y clientSecret. Para obtener uno, diríjase a //console.developers.google.com y cree un nuevo proyecto. Luego, vaya a Habilitar API y servicios y habilite la API de Google+. Seleccione la API y haga clic en crear credenciales.

Complete el formulario y use la misma URL de devolución de llamada tanto en el formulario como en su archivo. Asegúrese de leer los comentarios sobre el código para averiguar cómo encaja todo.

app.js

// Required dependencies const express = require('express'); const app = express(); const passport = require('passport'); const GoogleStrategy = require('passport-google-oauth20'); const cookieSession = require('cookie-session'); // cookieSession config app.use(cookieSession({ maxAge: 24 * 60 * 60 * 1000, // One day in milliseconds keys: ['randomstringhere'] })); app.use(passport.initialize()); // Used to initialize passport app.use(passport.session()); // Used to persist login sessions // Strategy config passport.use(new GoogleStrategy({ clientID: 'YOUR_CLIENTID_HERE', clientSecret: 'YOUR_CLIENT_SECRET_HERE', callbackURL: '//localhost:8000/auth/google/callback' }, (accessToken, refreshToken, profile, done) => { done(null, profile); // passes the profile data to serializeUser } )); // Used to stuff a piece of information into a cookie passport.serializeUser((user, done) => { done(null, user); }); // Used to decode the received cookie and persist session passport.deserializeUser((user, done) => { done(null, user); }); // Middleware to check if the user is authenticated function isUserAuthenticated(req, res, next) { if (req.user) { next(); } else { res.send('You must login!'); } } // Routes app.get('/', (req, res) => { res.render('index.ejs'); }); // passport.authenticate middleware is used here to authenticate the request app.get('/auth/google', passport.authenticate('google', { scope: ['profile'] // Used to specify the required data })); // The middleware receives the data from Google and runs the function on Strategy config app.get('/auth/google/callback', passport.authenticate('google'), (req, res) => { res.redirect('/secret'); }); // Secret route app.get('/secret', isUserAuthenticated, (req, res) => { res.send('You have reached the secret route'); }); // Logout route app.get('/logout', (req, res) => { req.logout(); res.redirect('/'); }); app.listen(8000, () => { console.log('Server Started!'); }); 

index.ejs


    
  • Login
  • Secret
  • Logout

Como puede ver, hemos creado una /secretruta y solo le otorgamos acceso si el usuario está autenticado. Para verificar si el usuario está autenticado, hemos creado un middleware que verifica si la solicitud tiene el objeto de usuario en ella. Finalmente, para cerrar la sesión utilizamos el req.logout()método proporcionado por el pasaporte para borrar la sesión.

Aquí hay algunos recursos para aprender más sobre pasaporte.

Documentación oficial de Passport.js

Autenticación simple y discreta para Node.js www.passportjs.org

Conclusión

Aquí solo vimos una estrategia. Hay 500+ más. Le recomiendo que lea la documentación oficial de Passport y averigüe qué más ofrecen. Gracias por tomarte tu tiempo para leer esto. No dude en conectarse conmigo en LinkedIn, Twitter y GitHub. ¡Les deseo buena suerte!

Artículo anterior

Una rápida introducción al diseño de materiales usando Materialise

¿Qué es Material Design? medium.freecodecamp.org