Authentification/autorisation API
Authentification et autorisation d'une API
Notions théoriques
1. Introduction
Lorsqu'une application communique avec une API, il est souvent nécessaire de contrôler l'accès aux ressources.
Deux concepts fondamentaux permettent de sécuriser une API :
- L'authentification : Vérification de l'identité d'un utilisateur ou d'un système.
- L'autorisation : Définition des actions qu'un utilisateur authentifié a le droit d'effectuer.
2. Différence entre authentification et autorisation
Concept | Définition |
---|---|
Authentification | Vérifie que l'utilisateur est bien celui qu'il prétend être. |
Autorisation | Détermine les actions et ressources accessibles après authentification. |
Exemple :
- Authentification : Se connecter avec un identifiant et un mot de passe.
- Autorisation : Accéder à certaines pages en fonction du rôle de l'utilisateur.
3. Méthodes d'authentification
a) Authentification par mot de passe
L'utilisateur fournit un identifiant et un mot de passe stockés dans une base de données sécurisée.
b) Authentification par token (JWT)
Un JSON Web Token (JWT) est généré après connexion et envoyé dans chaque requête pour prouver l'identité de l'utilisateur.
c) Authentification OAuth 2.0
Permet à un utilisateur d'autoriser une application tierce à accéder à ses données sans partager son mot de passe.
4. Gestion de l'autorisation
a) Rôles et permissions
Chaque utilisateur peut avoir un rôle (admin
, utilisateur
, modérateur
), et chaque rôle définit des permissions (lecture
, écriture
, suppression
).
b) Middleware d'autorisation
Un middleware est un programme intermédiaire qui vérifie si un utilisateur a les droits nécessaires pour accéder à une ressource.
Exemple pratique
Il est possible de sécuriser une API avec Express.js :
- en utilisant JWT pour l'authentification
- et un middleware pour l'autorisation.
1. Installation des dépendances
npm install express jsonwebtoken bcryptjs dotenv
2. Mise en place du serveur Express
require("dotenv").config();
const express = require("express");
const jwt = require("jsonwebtoken");
const bcrypt = require("bcryptjs");
const app = express();
app.use(express.json());
const users = [{ id: 1, username: "admin", password: "$2a$10$..." }];
const generateToken = (user) => {
return jwt.sign({ id: user.id, role: "admin" }, process.env.JWT_SECRET, { expiresIn: "1h" });
};
app.post("/login", async (req, res) => {
const { username, password } = req.body;
const user = users.find(u => u.username === username);
if (!user || !await bcrypt.compare(password, user.password)) {
return res.status(401).json({ error: "Identifiants incorrects" });
}
const token = generateToken(user);
res.json({ token });
});
const verifyToken = (req, res, next) => {
const token = req.headers["authorization"];
if (!token) return res.status(403).json({ error: "Accès interdit" });
jwt.verify(token, process.env.JWT_SECRET, (err, user) => {
if (err) return res.status(401).json({ error: "Token invalide" });
req.user = user;
next();
});
};
app.get("/protected", verifyToken, (req, res) => {
res.json({ message: "Accès autorisé", user: req.user });
});
app.listen(3000, () => {
console.log("Serveur démarré sur http://localhost:3000");
});