Développement d'API Rest - Partie 2 : JWT et Connexion
Mise à jour :
Dans un monde où les API sont au cœur des architectures modernes, garantir leur sécurité est une priorité absolue. Dans notre précédent article, nous avons exploré les bases de Connexion, un puissant framework qui permet de construire des API RESTful en Python à partir de spécifications OpenAPI. Vous avez découvert comment démarrer rapidement, définir vos endpoints, et structurer votre projet pour répondre aux besoins des utilisateurs.
Mais qu’en est-il de la sécurisation de ces endpoints ? C’est ici que JWT (JSON Web Tokens) entre en jeu. Avant de plonger dans l’implémentation dans notre API Connexion, prenons un moment pour comprendre JWT (JSON Web Tokens) et pourquoi il est si largement utilisé pour sécuriser les APIs.
Qu’est-ce qu’un JWT ?
Un JWT est un standard ouvert (RFC 7519) qui permet d’échanger des informations entre deux parties de manière sécurisée. Ces informations sont encapsulées dans un token compact et auto-contenu. Le JWT est composé de trois parties distinctes :
- Header : Contient le type de token (JWT) et l’algorithme de signature utilisé (par exemple, HMAC-SHA256).
- Payload : Contient les données que vous souhaitez transmettre (appelées “claims”), comme l’identifiant de l’utilisateur et son rôle.
- Signature : Garantit que le token n’a pas été modifié en utilisant une clé secrète.
Un exemple de JWT encodé peut ressembler à ceci :
Lorsque le serveur génère un JWT, il est signé avec une clé secrète connue uniquement par le serveur. Le client inclut ce token dans chaque requête pour prouver son identité.
Fonctionnement Général de JWT dans une API
Voici un aperçu des étapes principales lorsque vous utilisez JWT dans une API :
-
Authentification initiale :
- L’utilisateur envoie ses identifiants (par exemple, email et mot de passe)
à l’endpoint
/login
. - Si les identifiants sont valides, le serveur génère un JWT et le renvoie au client.
- L’utilisateur envoie ses identifiants (par exemple, email et mot de passe)
à l’endpoint
-
Requêtes sécurisées :
-
Pour chaque requête vers un endpoint protégé, le client inclut le JWT dans l’en-tête
Authorization
: -
Le serveur décode le token, vérifie sa validité (signature, expiration, etc.), et autorise ou refuse l’accès.
-
-
Expiration et renouvellement :
- Une fois le JWT expiré, l’utilisateur doit se reconnecter pour obtenir un nouveau token ou utiliser un système de “refresh token”.
Pourquoi utiliser JWT dans une API ?
L’authentification avec JWT présente plusieurs avantages par rapport aux méthodes traditionnelles, comme les sessions basées sur des cookies :
-
Sans état (Stateless) :
- Le serveur n’a pas besoin de stocker les sessions en mémoire ou dans une base de données.
- Tout ce dont le serveur a besoin est la clé secrète pour valider le JWT.
-
Autonomie des données :
- Les informations sur l’utilisateur (comme son rôle ou son identifiant) sont directement intégrées dans le JWT.
- Cela simplifie les interactions serveur-client, car tout est inclus dans le token.
-
Sûreté :
- Chaque token est signé numériquement, garantissant que son contenu n’a pas été altéré.
- Une date d’expiration peut être incluse pour limiter la durée de validité d’un token.
-
Compatibilité multiplateforme :
- Les JWT sont indépendants des technologies backend ou frontend. Ils peuvent être utilisés avec n’importe quelle API REST ou GraphQL.
Quand éviter JWT ?
Bien que puissant, JWT n’est pas toujours la solution idéale. Voici quelques situations où il est préférable d’utiliser une méthode différente :
- Si vous avez besoin de révoquer les tokens immédiatement après la déconnexion (JWT est difficile à invalider sans base de données).
- Pour des systèmes où la gestion des sessions côté serveur est simple et suffisante.
- Lorsque vous traitez des données extrêmement sensibles qui ne doivent pas transiter dans les requêtes.
Mise en place de JWT dans une API Connexion
Maintenant que nous avons vu pourquoi JWT est utile pour sécuriser une API, passons à sa mise en œuvre pratique avec Connexion. Dans cette section, nous allons configurer notre projet pour générer, valider et utiliser des tokens JWT dans une API existante.
Gestion des Tokens JWT
Ajoutons un module pour gérer la génération et la validation des tokens JWT.
Le fichier app/utils/jwt.py
** :
Ajouter l’Endpoint /login
**
L’endpoint /login
permet à un utilisateur de s’authentifier avec ses
identifiants. Si les informations sont valides, un token JWT est généré et
retourné.
Implémentation de l’Endpoint /login
Voyons maintenant comment implémenter l’endpoint /login
dans notre
application. Nous allons vérifier les identifiants de l’utilisateur, générer un
token JWT et le renvoyer en cas de succès.
Ajouter un Schéma de Sécurité dans api.yaml
**
Dans le fichier openapi.yaml
, configurez un schéma de sécurité bearerAuth
pour
les endpoints nécessitant un token JWT.
Il ne faut pas oublier de définir la fonction verify_bearer_token
dans la clé
x-bearerInfoFunc
.
Protéger les Endpoints avec JWT
Pour protéger un endpoint, ajoutez le schéma de sécurité bearerAuth
dans la
section security
de l’endpoint.
Tester l’API**
-
Obtenir un Token JWT avec
/login
:Réponse attendue :
-
Accéder à un Endpoint Protégé :
Conclusion
Avec ces étapes, vous avez une API sécurisée avec JWT fonctionnant sous Connexion. Vous avez appris à générer des tokens JWT, à les valider et à les utiliser pour protéger vos endpoints. JWT est un outil puissant pour sécuriser les API, en particulier dans un environnement sans état comme les APIs RESTful.
Dans le prochain guide, nous verrons comment gérer les rôles et les permissions pour un contrôle d’accès plus fin.