Maison > interface Web > js tutoriel > le corps du texte

API d'authentification utilisateur avec Express, JWT, Bcrypt et MySQL

DDD
Libérer: 2024-11-05 13:32:02
original
986 Les gens l'ont consulté

User Authentication API with Express, JWT, Bcrypt, and MySQL

Cette application est un simple serveur d'authentification construit avec Express, utilisant des jetons Web JSON (JWT) pour la gestion des sessions et bcrypt pour stocker en toute sécurité les mots de passe. Les utilisateurs peuvent s'inscrire et se connecter pour accéder aux itinéraires protégés. MySQL est utilisé pour stocker les données utilisateur.

Technologies utilisées

1. Express.js : Framework Web pour la gestion des routes et des middlewares.
2. bcrypt.js : Bibliothèque pour hacher les mots de passe en toute sécurité.
3. jsonwebtoken : bibliothèque pour créer et vérifier des jetons JWT.
4. mysql2 : client MySQL pour Node.js avec prise en charge de Promises.
5. cookie-parser : Middleware pour analyser les cookies.

Répartition du code

1. Importer les bibliothèques requises

const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const cookieParser = require('cookie-parser');
const mysql = require('mysql2/promise');
Copier après la connexion
Copier après la connexion
  • express : Fournit des fonctions pour créer des routes et gérer les requêtes HTTP.
  • jsonwebtoken : utilisé pour créer et vérifier des JWT pour les sessions utilisateur.
  • bcryptjs : Utilisé pour hacher les mots de passe avant de les stocker dans la base de données.
  • cookie-parser : Middleware pour analyser les cookies des requêtes HTTP entrantes.
  • mysql2/promise : client MySQL avec support de promesse, permettant des opérations asynchrones.

2. Initialisez l'application Express et définissez les constantes

const app = express();
const PORT = 3000;
const JWT_SECRET = 'your_jwt_secret_key';
Copier après la connexion
Copier après la connexion
  • app : l'instance d'application Express.
  • PORT : Le port sur lequel le serveur écoutera.
  • JWT_SECRET : Une clé secrète utilisée pour signer les JWT. Remplacez-le par une valeur sécurisée et générée aléatoirement en production.

3. Configuration de la connexion à la base de données

const db = await mysql.createConnection({
    host: 'localhost',
    user: 'your_mysql_user',
    password: 'your_mysql_password',
    database: 'user_auth'
});

Copier après la connexion
Copier après la connexion
  • db : L'objet de connexion à la base de données MySQL.
  • mysql.createConnection() : établit une connexion à la base de données MySQL à l'aide de async/await, ce qui est nécessaire pour les requêtes non bloquantes.
  • hôte : votre nom d'hôte de l'application MySql, si vous l'exécutez sur localhost, mettez localhost uniquement, si vous avez déployé votre MySql sur un serveur, utilisez le nom d'hôte du serveur avec PORT.
  • utilisateur : votre nom d'utilisateur MySql
  • mot de passe : votre mot de passe MySql
  • base de données : Le nom de la base de données

4. Configuration du middleware

app.use(express.json());
app.use(cookieParser());
Copier après la connexion
Copier après la connexion
  • express.json() : Middleware pour analyser les corps des requêtes JSON.
  • cookieParser() : Middleware pour analyser les cookies, nous permettant de lire les cookies de req.cookies.

5. Enregistrer l'itinéraire

/s'inscrire
Cet itinéraire enregistre un nouvel utilisateur en hachant son mot de passe et en l'enregistrant dans la base de données.

const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const cookieParser = require('cookie-parser');
const mysql = require('mysql2/promise');
Copier après la connexion
Copier après la connexion
  • db.execute() : exécute une requête pour vérifier si un utilisateur avec l'e-mail donné existe déjà. S'ils le font, renvoyez un statut 400.
  • bcrypt.hash(password, 10) : hache le mot de passe avec une valeur de sel de 10 pour des raisons de sécurité.
  • db.execute() (Insérer) : enregistre le nom, l'adresse e-mail et le mot de passe haché de l'utilisateur dans la base de données.

6. Itinéraire de connexion

/connexion
Cette route connecte un utilisateur existant en vérifiant ses informations d'identification et en générant un jeton JWT.

const app = express();
const PORT = 3000;
const JWT_SECRET = 'your_jwt_secret_key';
Copier après la connexion
Copier après la connexion
  • bcrypt.compare(password, user.password) : Vérifie si le mot de passe haché correspond à celui stocké dans la base de données.
  • jwt.sign() : crée un JWT qui inclut des informations utilisateur (par exemple, identifiant, nom et e-mail). Le jeton expire dans 1 heure. La méthode jwt.sign() prend deux arguments payload, JWT_SECRET, options(facultatif)
  • res.cookie() : Définit un cookie avec le JWT, sécurisé par httpOnly (accessible uniquement par le serveur) et les paramètres de mêmeSite.

7. Middleware de vérification JWT

Le middleware verifyToken garantit que seules les requêtes avec un jeton JWT valide peuvent accéder aux routes protégées.

const db = await mysql.createConnection({
    host: 'localhost',
    user: 'your_mysql_user',
    password: 'your_mysql_password',
    database: 'user_auth'
});

Copier après la connexion
Copier après la connexion
  • req.cookies.token : Extrait le jeton des cookies.
  • jwt.verify(token, JWT_SECRET) : vérifie le jeton à l'aide de la clé secrète JWT. S'il est valide, decoded **contient la charge utile du jeton, qui est attribuée à **req.user.
  • next() : passe au middleware suivant si le jeton est valide.

8. Itinéraire protégé - /protégé

Un exemple d'itinéraire protégé accessible uniquement aux utilisateurs authentifiés. Il renvoie un message d'accueil personnalisé utilisant le nom de l'utilisateur du jeton.

app.use(express.json());
app.use(cookieParser());
Copier après la connexion
Copier après la connexion
  • verifyToken : Middleware appliqué pour vérifier le statut d'authentification de l'utilisateur.
  • req.user.name : accède au nom de l'utilisateur à partir de la charge utile JWT décodée.

9. Démarrez le serveur

Le serveur écoute sur le PORT défini.

app.post('/register', async (req, res) => {
    const { name, email, password } = req.body;

    try {
        // Check if user already exists
        const [rows] = await db.execute('SELECT * FROM users WHERE email = ?', [email]);
        if (rows.length > 0) {
            return res.status(400).json({ message: 'User already exists' });
        }

        // Hash the password
        const hashedPassword = await bcrypt.hash(password, 10);

        // Save the user in the database
        await db.execute('INSERT INTO users (name, email, password) VALUES (?, ?, ?)', [name, email, hashedPassword]);
        res.status(201).json({ message: 'User registered successfully!' });
    } catch (error) {
        console.error(error);
        res.status(500).json({ message: 'Server error' });
    }
});

Copier après la connexion

Code complet

app.post('/login', async (req, res) => {
    const { email, password } = req.body;

    try {
        // Find user
        const [rows] = await db.execute('SELECT * FROM users WHERE email = ?', [email]);
        const user = rows[0];
        if (!user) {
            return res.status(400).json({ message: 'User not found' });
        }

        // Check password
        const isMatch = await bcrypt.compare(password, user.password);
        if (!isMatch) {
            return res.status(400).json({ message: 'Invalid credentials' });
        }

        // Create JWT token
        const token = jwt.sign({ id: user.id, name: user.name, email: user.email }, JWT_SECRET, { expiresIn: '1h' });

        // Set JWT in cookie
        res.cookie('token', token, {
            httpOnly: true,
            secure: process.env.NODE_ENV === 'production',
            sameSite: 'Strict',
            maxAge: 3600000 // 1 hour
        });

        res.json({ message: 'Logged in successfully!' });
    } catch (error) {
        console.error(error);
        res.status(500).json({ message: 'Server error' });
    }
});

Copier après la connexion

Résumé

Cette application :

  1. Permet l'enregistrement des utilisateurs en hachant les mots de passe et en stockant les données utilisateur dans MySQL.
  2. Prend en charge la connexion sécurisée avec l'authentification JWT.
  3. Utilise des cookies pour stocker le JWT côté client.
  4. Fournit un middleware pour vérifier les JWT avant d'accorder l'accès aux routes protégées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal