Récemment, j'ai commencé à travailler avec l'authentification basée sur JWT. Après la connexion de l'utilisateur, un jeton utilisateur est généré, qui ressemblera à "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmmFtZSI6kpvaG4gRG9lIiwiYWRTWWHVHWK.
Il se compose de trois parties séparées chacune par un point (.). La première partie est l'en-tête codé en Base64. Après le décodage, nous obtiendrons quelque chose comme {"alg": "HS256", // Algorithme utilisé "typ": "JWT"}
La deuxième partie est les revendications et codées en Base64. Après le décodage, nous obtiendrons quelque chose comme {"sub": "1234567890", "name": "John Doe", "admin": true}
La troisième partie est la signature et est générée avec
HMACSHA256 (base64UrlEncode (en-tête) + "." + Base64UrlEncode (payload), secret base64 codé )
Maintenant, quelle est cette clé secrète et comment générer cette clé secrète ??
J'ai essayé un générateur en ligne comme " http://kjur.github.io/jsjws/tool_jwt.html " mais à force d'obtenir beaucoup d'aide.
L'algorithme (HS256
) utilisé pour signer le JWT signifie que le secret est une clé symétrique connue à la fois de l'expéditeur et du destinataire. Il est négocié et distribué hors bande. Par conséquent, si vous êtes le destinataire prévu du jeton, l'expéditeur aurait dû vous fournir le secret hors bande.
Si vous êtes l'expéditeur, vous pouvez utiliser une chaîne arbitraire d'octets comme secret, elle peut être générée ou choisie à dessein. Vous devez vous assurer que vous fournissez le secret au destinataire prévu hors bande.
Pour mémoire, les 3 éléments du JWT ne sont pas codés en base64 mais codés en base64url, qui est une variante du codage en base64 qui se traduit par une valeur sûre pour les URL.
Vous pouvez écrire votre propre générateur. La clé secrète est essentiellement un tableau d'octets. Assurez-vous que la chaîne que vous convertissez en tableau d'octets est codée en base64. Dans Java vous pourriez faire quelque chose comme ça.
String key = "random_secret_key";
String base64Key = DatatypeConverter.printBase64Binary(key.getBytes());
byte[] secretBytes = DatatypeConverter.parseBase64Binary(base64Key);
La clé secrète est combinée avec l'en-tête et la charge utile pour créer un hachage unique. Vous ne pouvez vérifier ce hachage que si vous avez la clé secrète.
Vous pouvez choisir un bon mot de passe long. Ou vous pouvez le générer à partir d'un site comme this .
Exemple (mais n'utilisez pas celui-ci maintenant):
8Zz5tw0Ionm3XPZZfN0NOml3z9FMfmpgXwovR9fp6ryDIoGRM8EPHAB6iHsc0fb