Clé privée auth0
1. Introduction
JWT (JSON Web Token) est une norme qui définit un moyen compact et sécurisé de transmettre des données avec une signature entre deux parties. La charge utile d’un JWT est un objet JSON qui fait valoir certaines revendications. Cette charge utile peut être facilement vérifiée et approuvée par le vérificateur car elle est signée numériquement. Les JWT peuvent être signés à l’aide d’une clé secrète ou d’une paire de clés publique/privée .
Dans ce tutoriel, nous allons apprendre à créer et décoder un JWT à l’aide de la bibliothèque Java JWT Auth0.
deux. Structure d’un JWT
Un JWT se compose essentiellement de trois parties :
Chacune de ces sections représente une chaîne codée en Base64 séparée par des points ('.') en tant que délimiteur.
L’en-tête JWT se compose généralement de deux parties : le type de jeton, qui est « JWT », et l’algorithme de signature utilisé pour signer le JWT.
La bibliothèque Java JWT Auth0 fournit diverses implémentations d’algorithmes pour signer un JWT comme HMAC, RSA et ECDSA.
Jetons un coup d’œil à un exemple d’en-tête JWT : l’objet d’en-tête
ci-dessus est ensuite encodé en Base64 pour former la première partie du JWT.
2.2. Charge utile
JWT La charge utile JWT contient un ensemble de revendications. Les affirmations sont essentiellement des déclarations sur une entité ainsi que des données supplémentaires.
Il existe trois types de revendications :
- Enregistrées – Il s’agit d’un ensemble de revendications prédéfinies utiles qui sont recommandées mais pas obligatoires. Ces noms de revendication ne comportent que trois caractères pour que le JWT reste compact. Parmi les revendications enregistrées, citons iss (émetteur), exp (délai d’expiration) et sub (sujet), entre autres.
- Public – Ceux-ci peuvent être définis à volonté par ceux qui utilisent des JWT.
- Privé – Nous pouvons utiliser ces revendications pour créer des revendications personnalisées.
Jetons un coup d’œil à un exemple de charge utile JWT :
Ici, nous pouvons voir que la charge utile contient un userId de revendication privée indiquant l’ID de l’utilisateur connecté. En outre, nous pouvons trouver d’autres revendications restreintes utiles qui définissent des détails supplémentaires sur le JWT.
La charge utile JWT est ensuite encodée en Base64 pour former la deuxième partie du JWT.
2.3. Assurer la traduction intégrale Signature JWT
Enfin, la signature JWT est générée lorsque nous signons l’en-tête codé et la charge utile codée à l’aide d’un algorithme de signature avec une clé secrète . La signature peut ensuite être utilisée pour vérifier si les données du JWT sont valides.
Il est important de noter que toute personne ayant accès à un JWT peut facilement décoder et afficher son contenu . Signé Les jetons peuvent vérifier l’intégrité des revendications qu’ils contiennent. Si les jetons sont signés à l’aide de paires de clés publiques/privées, la signature certifie également que seule la partie détenant la clé privée est celle qui l’a signée.
Enfin, en combinant les trois parties, nous obtenons notre JWT :
Voyons maintenant comment nous pouvons créer et gérer un JWT à l’aide de la bibliothèque Java JWT Auth0.
3. Accès Utilisation d’Auth0
Auth0 fournit une bibliothèque Java facile à utiliser pour la création et la gestion des JWT.
3.1.
Pour commencer, nous ajoutons la dépendance Maven de la bibliothèque Java JWT Auth0 au fichier pom.xml de notre projet :
3.2. Configurer l’algorithme et le vérificateur
Nous créons d’abord une instance de la classe Algorithm. Dans ce tutoriel, nous allons utiliser l’algorithme HMAC256 pour signer notre JWT :
Ici, nous initialisons un instance d’un algorithme avec une clé secrète. Nous l’utiliserons plus tard lors de la création et de la vérification d’un jeton.
De plus, initialisons une instance de JWTVerifier que nous utiliserons pour vérifier le jeton créé :
Pour initialiser le vérificateur, nous utilisons la méthode JWT.require(Algorithm) . Cette méthode renvoie une instance de Verification que nous pouvons ensuite utiliser pour construire une instance de JWTVerifier .
Nous sommes maintenant prêts à créer notre JWT.
3.3. Pour
créer un JWT, nous utilisons la méthode JWT.create() . La méthode retourne une instance de la classe JWTCreator.Builder. Nous allons utiliser cette classe Builder pour construire le jeton JWT en signant les revendications à l’aide de l’algorithme instance :
L’extrait ci-dessus renvoie un JWT :
Discutons de certaines des méthodes de classe JWTCreator.Builder utilisées ci-dessus pour définir certaines des revendications :
- withIssuer() – identifie la partie qui a créé le jeton et l’a signé
- withSubject() – identifie le sujet du JWT
- withIssuedAt() – identifie l’heure à laquelle le JWT a été créé ; nous pouvons l’utiliser pour déterminer l’âge du JWT
- withExpiresAt() – identifie l’heure d’expiration du JWT
- withJWTId() – identifiant unique pour le JWT
- withNotBefore() – identifie l’heure avant laquelle le JWT ne doit pas être accepté pour le traitement
- withClaim() – utilisé pour Définir n’importe quelle revendication personnalisée
3.4. Vérification d’un JWT
De plus, pour vérifier un JWT, nous utilisons la méthode JWTVerifier.verify(String) du JWTVerifier que nous avons initialisé précédemment. Si le JWT est valide, la méthode l’analyse et renvoie une instance de DecodedJWT .
L’instance DecodedJWT fournit diverses méthodes pratiques que nous pouvons utiliser pour récupérer les revendications contenues dans le JWT. Si le JWT n’est pas valide, la méthode lève une JWTVerificationException .
Décodons le JWT que nous avons créé précédemment :
une fois que nous obtenons une instance de l’instance DecodedJWT, nous pouvons utiliser ses différentes méthodes getter pour obtenir les revendications.
Par exemple, pour obtenir les revendications personnalisées, nous utilisons la méthode DecodedJWT.getClaim(String). Cette méthode renvoie un instance d’une revendication :
Ici, nous récupérons notre userId de revendication personnalisé que nous avons défini précédemment lors de la création du JWT. Nous pouvons maintenant obtenir la valeur de notre revendication en appelant Claim.asString() ou toute autre méthode disponible basée sur le type de données de la revendication : L’extrait
ci-dessus renvoie la chaîne « 1234 » de notre revendication personnalisée.
En plus de la librairie Java JWT Auth0, Auth0 fournit également un débogueur JWT intuitif basé sur le web pour nous aider à décoder et vérifier un JWT.
4. Épisode 4 Conclusion
Dans cet article, nous avons examiné la structure d’un JWT et comment il peut être utilisé pour l’authentification.
Nous avons ensuite utilisé la bibliothèque Java JWT Auth0 pour créer et vérifier l’intégrité d’un jeton à l’aide de sa signature, de son algorithme et de sa clé secrète.
Le code qui sous-tend cet article est disponible sur GitHub. Une fois que vous êtes connecté en tant que membre Baeldung Pro , commencez à apprendre et à coder sur le projet.