Aprenda a manejar la autenticación con Node usando Passport.js

Apóyeme leyéndolo de su fuente original: FUENTE ORIGINAL

En este artículo, aprenderá a manejar la autenticación para su servidor Node usando Passport.js. Este artículo no cubre la autenticación Frontend. Use esto para configurar su autenticación de backend (generar token para cada usuario y proteger rutas).

Tenga en cuenta que si se queda atascado en algún paso, puede consultar este repositorio de GitHub .

En este artículo te enseñaré lo siguiente:

  • Manejo de rutas protegidas
  • Manejo de tokens JWT
  • Manejo de respuestas no autorizadas
  • Creando una API básica
  • Creando modelos y esquemas

Introducción

¿Qué es Passport.js?

Passport es un middleware de autenticación para Node.js. Como es extremadamente flexible y modular, Passport se puede colocar discretamente en cualquier aplicación web basada en Express. Un conjunto completo de estrategias admite la autenticación mediante un nombre de usuario y contraseña, Facebook, Twitter y más. Obtenga más información sobre Passport aquí.

Tutorial

Creando nuestro servidor de nodos desde cero

Crea un nuevo directorio con este "app.js"archivo dentro:

Instalaremos nodemon para facilitar el desarrollo.

y luego ejecutaremos nuestro "app.js" con él.

$ nodemon app.js

Creando el modelo de usuario

Cree una nueva carpeta llamada "modelos",y cree el archivo "Users.js" dentro de esa carpeta.Aquí es donde definiremos nuestro "UsersSchema". Vamos a utilizar JWTy Cryptogenerar hashy a saltpartir de la passwordcadena recibida . Esto luego se utilizará para validar al usuario.

Agreguemos nuestro modelo recién creado a "app.js".

Agregue la siguiente línea a su archivo "app.js" después de la configuración Mongoose:

require('./models/Users');

Configurar pasaporte

Cree una nueva carpeta "config" con el archivo "passport.js" dentro:

En este archivo, usamos el método validatePasswordque definimos en elUser model. Según el resultado, devolvemos una salida diferente a la de Passport LocalStrategy.

Conectemos "passport.js" a nuestro archivo "app.js". Agregue la siguiente línea debajo de todomodels :

require('./config/passport');

Rutas y opciones de autenticación

Cree una nueva carpeta llamada "rutas" con el archivo "auth.js" en su interior.

En este archivo usamos la función getTokenFromHeaderspara obtener un token JWT que se enviará desde el lado del cliente en los encabezados de la solicitud . También creamos un authobjeto con propiedades optionaly required. Los usaremos más adelante en nuestras rutas.

En la misma carpeta "rutas" crea un archivo "index.js":

Ahora necesitamos una carpeta "api" dentro de la carpeta "rutas", con otro archivo "index.js" dentro.

Ahora, creemos el archivo "users.js" que requerimos en "api / index.js".

Primero, crearemos una ruta de autenticación opcional‘/’ que se utilizará para la creación de un nuevo modelo (registro).

router.post('/', auth.optional, (req, res, next) ...

Después de eso, crearemos otra ruta de autenticación opcional‘/login’ . Esto se utilizará para activar nuestra configuración de pasaporte y validar una contraseña recibida con correo electrónico.

router.post('/login', auth.optional, (req, res, next) ...

Por último, crearemos una ruta de autenticación requerida , que se utilizará para devolver el usuario que ha iniciado sesión actualmente. Solo los usuarios que han iniciado sesión (los usuarios que tienen su token enviado correctamente a través de los encabezados de la solicitud) tienen acceso a esta ruta.

router.get('/current', auth.required, (req, res, next) ...

Agreguemos nuestra carpeta "rutas" a "app.js".Agregue la siguiente línea debajo de nuestro pasaporterequire :

app.use(require('./routes'));

Prueba de ruta

Usaré carteropara enviar solicitudes a nuestro servidor.

Nuestro servidor acepta el siguiente cuerpo:

{ "user": { "email": String, "password": String } }

Crear una solicitud POST para crear un usuario

Cuerpo de prueba:

Respuesta:

{ "user": { "_id": "5b0f38772c46910f16a058c5", "email": "[email protected]", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImVyZGVsamFjLmFudG9uaW9AZ21haWwuY29tIiwiaWQiOiI1YjBmMzg3NzJjNDY5MTBmMTZhMDU4YzUiLCJleHAiOjE1MzI5MDgxNTEsImlhdCI6MTUyNzcyNDE1MX0.4TWc1TzY6zToHx_O1Dl2I9Hf9krFTqPkNLHI5U9rn8c" } }

Ahora usaremos este token y lo agregaremos a nuestros "Encabezados" en la configuración de Postman.

And now let’s test our auth only route.

Creating a GET request to return the currently logged in user

Request URL:

GET //localhost:8000/api/users/current

Response:

{ "user": { "_id": "5b0f38772c46910f16a058c5", "email": "[email protected]", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImVyZGVsamFjLmFudG9uaW9AZ21haWwuY29tIiwiaWQiOiI1YjBmMzg3NzJjNDY5MTBmMTZhMDU4YzUiLCJleHAiOjE1MzI5MDgzMTgsImlhdCI6MTUyNzcyNDMxOH0.5UnA2mpS-_puPwwxZEb4VxRGFHX6qJ_Fn3pytgGaJT0" } }

Let’s try to do it without token in “Headers”.

Response:

The end

Thank you for going through this tutorial. If you notice any errors please report them to me. If you got stuck on any step, please refer to this GitHub repo.

You can contact me through:

  • erdeljac DOT antonio AT gmail.com
  • Linkedin

Check out my app SwipeFeed.