A JSON Web Token (JWT) is defined in three parts:
En-tête : contient la définition et le format du JWT et du JWS ;
Ensemble de charges utiles/réclamations : contient des informations supplémentaires, telles que l'ID de l'auditeur, les balises utilisateur, etc. ;
Signature : signature cryptographique (c'est-à-dire hachage) de l'en-tête et des charges utiles (ou payloads), à l'aide de l'algorithme spécifié dans l'en-tête.
Dans JWT, les différentes parties se présentent en format JSON compact, codées en Base64URL, et concaténées avec des points (« . »).
L'encodage utilisé est Base64URL, tel que défini dans https://tools.ietf.org/html/rfc4648#section-5, et non pas le traditionnel Base64. La différence réside principalement dans le fait que deux caractères ont été remplacés par des caractères sécurisés pour les URL, et que le remplissage final (« = ») a été supprimé.
De nombreux exemples sur le Web expliquent la procédure dans différentes langues - l'exercice est laissé au lecteur. Pour des besoins expérimentaux ou de développement, vous pouvez utiliser la commande openssl pour encoder en Base64URL avec la ligne de commande suivante :echo -n "Data to encode" | openssl enc -a -A | tr -d '=' | tr '/+' '_-'
Intitulé protégé JWT
Clé | Description | Valeur | Requis | Remarques |
---|---|---|---|---|
typ | Type | JWT | ✅ |
|
alg | Algorithme | HS256 | ✅ | Identifie l'algorithme de signature comme HMAC utilisant SHA-256 |
kid | Identifiant de la clé | Identifiant de la clé | ✅ | L'identifiant de la clé secrète, fourni par Triton |
Exemple d'en-tête JWT
{"typ":"JWT","alg":"HS256","kid":"a1b2c3d4e5"}
Encodé avec Base64URL :eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6ImExYjJjM2Q0ZTUifQ
Charge JWT (Claims Set)
Les paramètres spécifiques à l'application sont définis dans les guides d'utilisation de chaque application. Les paramètres ci-dessous sont communs à toutes les applications :
Clé | Description | Valeur | Requis | Remarques |
---|---|---|---|---|
iat | Émis à | Horodatage Unix de la création du jeton. | ✅ | Le service l'utilise pour plafonner le temps d'expiration du jeton. |
exp | Expiration | Horodatage Unix quand le jeton expire. |
| S’il est fourni, cela permet au jeton d’expirer avant la durée maximale autorisée définie par le service. (L’expiration du service par défaut est de 60 secondes.) |
iss | Émetteur | Identifiant du composant générateur de jetons (par exemple : lecteur, back-end, etc.) |
| Cet identifiant doit être court. |
aud | Audience | td |
| Utilisé pour s'assurer que nous n'interprétons pas un jeton qui ne nous est pas destiné. |
sub | Sujet | Identifiant de l'utilisateur (de l'authentification) |
| Pas toujours applicable ; par exemple, si le jeton a été généré par le lecteur plutôt que par un système d'authentification. Si un identifiant d'utilisateur est disponible, il doit être fourni. |
Dans l’exemple ci-dessous, le paramètre spécifique à l’application "td-reg"
est fourni :
Exemple de charge utile JWT
{"iss":"pdvy","sub":"foo@bar.com","iat":1429802716,"td-reg":true}
Encodé avec Base64URL :eyJpc3MiOiJwZHZ5Iiwic3ViIjoiZm9vQGJhci5jb20iLCJpYXQiOjE0Mjk4MDI3MTYsInRkLXJlZyI6dHJ1ZX0
Signature JWS
Signature standard HS256, telle que définie dans la RFC du JWS.
Triton génère et fournit la clé secrète HMAC.
Les clés secrètes sont fournies à l'échelle du diffuseur (c'est-à-dire qu'une clé est valable pour toutes les stations qui font partie du diffuseur).
La clé HMAC sera fournie à l'émetteur de manière sécurisée (TBD).
La clé HMAC rend cette solution sûre - il est très important qu'elle soit protégée autant que possible (par exemple, par obscurcissement) et qu'elle ne soit transportée que par des canaux sécurisés). Toute personne en possession de la clé est capable de générer un jeton sécurisé valide !
Vous pouvez générer un HMAC-SHA256 à l’aide de la commande openssl, comme suit :
echo -n "Data to sign" | openssl dgst -sha256 -hmac <hmac-key>
Combinez ceci avec l'astuce précédente pour l'encodage en Base64URL, et vous pouvez générer la signature JWS comme suit (notez le paramètre -binary) :
echo -n "<jwt-header>.<jwt-payload>" | openssl dgst -binary -sha256 -hmac <hmac-key> | openssl enc -a -A | tr -d '=' | tr '/+' '_-'
Les exemples présentés ci-dessus, une fois concaténés, donnent le jeton suivant qui doit être signé :
Exemple d'en-tête et charge utile JWT
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6ImExYjJjM2Q0ZTUifQ.eyJpc3MiOiJwZHZ5Iiwic3ViIjoiZm9vQGJhci5jb20iLCJpYXQiOjE0Mjk4MDI3MTYsInRkLXJlZyI6dHJ1ZX0
Pour l’exemple suivant, nous utiliserons la chaîne « ThisIsASecretValue » comme clé HMAC.
La signature HS256 (c'est-à-dire SHA256 HMAC) résultante est :
Exemple de signature JWS
61e35c7ebed1729bf83fc4eee98d9b46e1aa6141903349478f22bf9c3f1258a0
Encodé (en tant que valeur binaire, pas en tant que chaîne) en Base64URL :YeNcfr7Rcpv4P8Tu6Y2bRuGqYUGQM0lHjyK_nD8SWKA
Le jeton et la signature JWT/JWS finaux sont donc les suivants :
Exemple de jeton JWT complet (en-tête+charge utile+signature)
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6ImExYjJjM2Q0ZTUifQ.eyJpc3MiOiJwZHZ5Iiwic3ViIjoiZm9vQGJhci5jb20iLCJpYXQiOjE0Mjk4MDI3MTYsInRkLXJlZyI6dHJ1ZX0.YeNcfr7Rcpv4P8Tu6Y2bRuGqYUGQM0lHjyK_nD8SWKA