Creemos nuestra propia API de autenticación con Nodejs y GraphQL
La autenticación es una de las tareas más desafiantes para los desarrolladores que recién comienzan con GraphQL. Hay muchas consideraciones técnicas, incluido qué ORM sería fácil de configurar, cómo generar tokens seguros y contraseñas hash, e incluso qué biblioteca HTTP usar y cómo usarla.
En este artículo, nos centraremos en la legislación local. Quizás sea la forma más popular de manejar la autenticación en los sitios web modernos y lo hace solicitando el correo electrónico y la contraseña del usuario (a diferencia de, por ejemplo, usar la autenticación de Google).
Además, este artículo utiliza Apollo Server 2, JSON Web Tokens (JWT) y Sequelize ORM para crear una API de autenticación con Node.
Manejo de autentificación
Como en un sistema de inicio de sesión:
- La autenticación identifica o verifica a un usuario.
- La autorización consiste en validar las rutas (o partes de la aplicación) a las que el usuario autenticado puede tener acceso.
El flujo para implementar esto es:
- El usuario se registra mediante contraseña y correo electrónico.
- Las credenciales del usuario se almacenan en una base de datos.
- El usuario es redirigido al inicio de sesión cuando se completa el registro.
- Al usuario se le concede acceso a recursos específicos cuando se autentica
- El estado del usuario se almacena en cualquiera de los medios de almacenamiento del navegador (por ejemplo
localStorage
, cookies, sesión) o JWT.
Requisitos previos
Antes de profundizar en la implementación, aquí hay algunas cosas que deberán seguir.
- Nodo 6 o superior
- Hilo (recomendado) o MNP
- Área de juegos GraphQL
- Conocimientos básicos de GraphQL y Node
- …¡una mente inquisitiva!
dependencias
Esta es una lista grande, así que entremos en ella:
- Servidor Apollo : un servidor GraphQL de código abierto que es compatible con cualquier tipo de cliente GraphQL. No usaremos Express para nuestro servidor en este proyecto. En su lugar, utilizaremos el poder de Apollo Server para exponer nuestra API GraphQL.
- bcryptjs : queremos codificar las contraseñas de los usuarios en nuestra base de datos. Por eso usaremos bcrypt. Se basa en Web Crypto API
getRandomValues
para obtener números aleatorios seguros. - dotenv : Usaremos dotenv para cargar variables de entorno desde nuestro
.env
archivo. - jsonwebtoken : una vez que el usuario inicia sesión, cada solicitud posterior incluye el JWT, lo que permitirá al usuario acceder a rutas, servicios y recursos permitidos con ese token.
jsonwebtoken
se utilizará para generar un JWT que se utilizará para autenticar a los usuarios. - nodemon : una herramienta que ayuda a desarrollar aplicaciones basadas en nodos reiniciando automáticamente la aplicación del nodo cuando se detectan cambios en el directorio. No queremos cerrar e iniciar el servidor cada vez que haya un cambio en nuestro código. Nodemon inspecciona los cambios cada vez en nuestra aplicación y reinicia automáticamente el servidor.
- mysql2 : un cliente SQL para Node. Necesitamos que nos conectemos a nuestro servidor SQL para poder ejecutar migraciones.
- sequelize : Sequelize es un ORM de nodo basado en promesas para Postgres, MySQL, MariaDB, SQLite y Microsoft SQL Server. Usaremos Sequelize para generar automáticamente nuestras migraciones y modelos.
- sequelize cli : Usaremos Sequelize CLI para ejecutar los comandos de Sequelize. Instálelo globalmente
yarn add --global sequelize-cli
en la terminal.
Configurar la estructura del directorio y el entorno de desarrollo.
Creemos un proyecto completamente nuevo. Crea una nueva carpeta y esto dentro de ella:
yarn init -y
La -y
bandera indica que estamos seleccionando sí a todas las yarn init
preguntas y usando los valores predeterminados.
También deberíamos poner un package.json
archivo en la carpeta, así que instalemos las dependencias del proyecto:
yarn add apollo-server bcrpytjs dotenv jsonwebtoken nodemon sequelize sqlite3
A continuación, agregamos Babe a nuestro entorno de desarrollo:
yarn add babel-cli babel-preset-env babel-preset-stage-0 --dev
Ahora configuramos Babel. Ejecute el toque .babelrc
en la terminal. Eso crea y abre un archivo de configuración de Babel y, en él, agregaremos esto:
{ "presets": ["env", "stage-0"]}
También sería bueno si nuestro servidor se iniciara y también migrara datos. Podemos automatizarlo actualizando package.json
con esto:
"scripts": { "migrate": " sequelize db:migrate", "dev": "nodemon src/server --exec babel-node -e js", "start": "node src/server", "test": "echo "Error: no test specified"" exit 1""}No related posts.
Deja un comentario