jwtCommencer avec jwt


Remarques

Un jeton Web JSON (JWT) est un moyen compact, sécurisé par des URL, de représenter des revendications pouvant être échangées entre des parties.

Tous les JWT consistent en un en- tête et une charge utile , qui sont des hachages JSON. Ces objets sont stringifiés et codés en Base64. L'en-tête et la charge utile codés sont combinés à une signature numérique (JWS) et les trois composants sont concaténés avec "." (période).

Lectures complémentaires

Comment savoir si vous avez un JWS ou un JWE?

À partir de la section 9 de la spécification JSON Web Encryption (RFC 7516):

L'en-tête JOSE d'un JWS peut être distingué de l'en-tête JOSE d'un JWE en examinant la valeur du paramètre d'en-tête "alg" (algorithme). Si la valeur représente une signature numérique ou un algorithme MAC, ou si la valeur est "none", c'est pour un JWS; s'il s'agit d'un algorithme de chiffrement de clé, de verrouillage de clé, de contrat à clé directe, d'accord de clé avec habillage de clé ou de chiffrement direct, il s'agit d'un JWE. (L'extraction de la valeur "alg" à examiner est simple lors de l'utilisation de la sérialisation JWS Compact ou de la sérialisation JWE Compact et peut s'avérer plus difficile lors de l'utilisation de la sérialisation JSON JWS ou de la sérialisation JWE JWE.)

Et

L'en-tête JOSE d'un JWS peut également être distingué de l'en-tête JOSE d'un JWE en déterminant s'il existe un membre "enc" (algorithme de chiffrement). Si le membre "enc" existe, c'est un JWE; sinon, c'est un JWS.

JWS (signé) ##

{
  "alg": "HS256"
}
 

JWE (crypté)

{
  "alg":"RSA1_5",
  "enc":"A256GCM",
  "iv":"__79_Pv6-fg",
  "x5t":"7noOPq-hJ1_hCnvWh6IeYI2w9Q0"
}
 

JSON Web Encryption (JWE)

JSON Web Encryption (JWE) représente le contenu chiffré à l'aide de structures de données basées sur JSON (JavaScript Object Notation). Il définit un moyen de chiffrer vos données de réclamation afin que seul le destinataire puisse lire les informations présentes dans un jeton.

Dans la sérialisation JSON JWE, un JWE est représenté comme un objet JSON contenant certains ou tous ces huit membres:

  "protected", with the value BASE64URL(UTF8(JWE Protected Header))
  "unprotected", with the value JWE Shared Unprotected Header
  "header", with the value JWE Per-Recipient Unprotected Header
  "encrypted_key", with the value BASE64URL(JWE Encrypted Key)
  "iv", with the value BASE64URL(JWE Initialization Vector)
  "ciphertext", with the value BASE64URL(JWE Ciphertext)
  "tag", with the value BASE64URL(JWE Authentication Tag)
  "aad", with the value BASE64URL(JWE AAD)
 

Les six chaînes de résultats encodées en base64url et les deux valeurs d'objet JSON non protégées sont représentées en tant que membres dans un objet JSON.

Exemple JWE

L'exemple suivant d'en-tête JWE déclare que:

  • la clé de cryptage de contenu est cryptée sur le destinataire à l'aide de l'algorithme RSA-PKCS1_1.5 pour produire la clé cryptée JWE
  • le texte en clair est chiffré à l'aide de l'algorithme AES-256-GCM pour produire le texte chiffré JWE
  • le vecteur d'initialisation 64 bits spécifié avec l'encodage base64url __79_Pv6-fg a été utilisé
  • L'empreinte du certificat X.509 correspondant à la clé utilisée pour chiffrer le JWE a l'encodage base64url 7noOPq-hJ1_hCnvWh6IeYI2w9Q0.
{
 "alg":"RSA1_5",
 "enc":"A256GCM",
 "iv":"__79_Pv6-fg",
 "x5t":"7noOPq-hJ1_hCnvWh6IeYI2w9Q0"
}
 

Base64url codant les octets de la représentation UTF-8 de l'en-tête JWE génère cette valeur d'en-tête JWE codée (avec sauts de ligne uniquement à des fins d'affichage):

eyJhbGciOiJSU0ExXzUiLA0KICJlbmMiOiJBMjU2R0NNIiwNCiAiaXYiOiJfXzc5
X1B2Ni1mZyIsDQogIng1dCI6Ijdub09QcS1oSjFfaENudldoNkllWUkydzlRMCJ
 

Lisez la spécification JSON Web Encryption (RFC 7516) pour plus d'informations.

JWT signé (JWS)

Un JWT signé inclut une signature codée Url Base64 en tant que troisième composant. L'algorithme utilisé pour générer la signature est indiqué dans l'en-tête.

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
.eyJzdWIiOiJKb2huIERvZSIsImFkbWluIjp0cnVlLCJpYXQiOjE0NzAzNTM5OTQsImV4cCI6MTQ3MDM1NzYyNywianRpIjoiNmU0MDRiYTgtZjg4NS00ZDVmLWJmYTItZTNmNWEwODM4MGE0In0
.7CfBdVP4uKsb0cogYepCvMLm8rcpjBYW1XZzA-a5e44
 

Entête

{
  "typ": "JWT",
  "alg": "HS256"
}
 

Ce JWT a été signé avec l'algorithme HMAC-SHA256, donc alg: HS256 .

Charge utile

{
  "sub": "John Doe",
  "admin": true,
  "iat": 1470353994,
  "exp": 1470357627,
  "jti": "6e404ba8-f885-4d5f-bfa2-e3f5a08380a4"
}
 

Ce JWT peut être vérifié avec le notsosecret secret UTF-8.

JWT non signé

Un JWT non signé a la valeur d'en-tête alg: none et un composant JWS (signature) vide:

eyJhbGciOiJub25lIn0
.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ
.
 

Le point final indique que la signature est vide.

Entête

{
  "alg": "none"
}
 

Charge utile

{
  "iss": "joe",
  "exp": 1300819380,
  "http://example.com/is_root": true
}
 

Que stocker dans un JWT

Le JWT RFC établit trois classes de revendications:

  • Réclamations enregistrées comme sub , iss , exp ou nbf

  • Réclamations publiques avec des noms publics ou des noms enregistrés par l'IANA qui contiennent des valeurs qui devraient être uniques comme email , address ou phone_number . Voir la liste complète

  • Les revendications privées à utiliser dans votre propre contexte et les valeurs peuvent provoquer des collisions

Aucune de ces revendications n'est obligatoire

Un JWT est autonome et doit éviter d'utiliser la session du serveur fournissant les données nécessaires pour effectuer l'authentification (pas besoin de stockage sur le serveur et d'accès à la base de données). Par conséquent, les informations sur les role ou les permissions peuvent être incluses dans les revendications privées de JWT.

Réclamations enregistrées

Les noms de réclamation suivants sont enregistrés dans le registre IANA "JSON Web Token Claims" établi au paragraphe 10.1.

  • iss (émetteur): identifie le principal qui a émis le JWT.
  • sub (sujet): identifie le principal objet de la JWT. Doit être unique
  • aud (audience): identifie les destinataires auxquels le JWT est destiné (tableau de chaînes / uri)
  • exp (délai d'expiration): identifie le délai d'expiration (UTC Unix) après lequel vous ne devez plus accepter ce jeton. Il devrait être après le moment de l'émission.
  • nbf (pas avant): identifie l'heure UTC Unix avant laquelle le JWT ne doit pas être accepté
  • iat (délivré à): identifie l'heure UTC Unix à laquelle le JWT a été émis
  • jti (JWT ID): fournit un identifiant unique pour le JWT.

Exemple

{
    "iss": "stackoverflow",
    "sub": "joe",
    "aud": ["all"],
    "iat": 1300819370,
    "exp": 1300819380,
    "jti": "3F2504E0-4F89-11D3-9A0C-0305E82C3301"
    "context": {
        "user": {
            "key": "joe",
            "displayName": "Joe Smith"
        },
        "roles":["admin","finaluser"]
    }
}