jwtAan de slag met jwt


Opmerkingen

Een JSON Web Token (JWT) is een compacte, URL-veilige manier om claims weer te geven die tussen partijen kunnen worden uitgewisseld.

Alle JWT's bestaan uit een header en payload , dit zijn JSON-hashes. Deze objecten zijn stringized en Base64-gecodeerd. De gecodeerde header en payload worden gecombineerd met een digitale handtekening (JWS) en alle drie componenten worden samengevoegd met "." (periode).

Verder lezen

Hoe weet je of je een JWS of JWE hebt?

Van sectie 9 van JSON Web Encryption-specificatie (RFC 7516):

De JOSE-header voor een JWS kan worden onderscheiden van de JOSE-header voor een JWE door de parameterwaarde van de "alg" (algoritme) header te onderzoeken. Als de waarde een digitale handtekening of MAC-algoritme vertegenwoordigt, of de waarde "geen" is, is dit voor een JWS; als het een Key Encryption, Key Wrapping, Direct Key Agreement, Key Agreement with Key Wrapping of Direct Encryption-algoritme vertegenwoordigt, is het voor een JWE. (Het extraheren van de te onderzoeken "alg" -waarde is eenvoudig bij het gebruik van de JWS Compact Serialization of de JWE Compact Serialization en kan moeilijker zijn bij het gebruik van de JWS JSON Serialization of de JWE JSON Serialization.)

En

De JOSE-header voor een JWS kan ook worden onderscheiden van de JOSE-header voor een JWE door te bepalen of er een "enc" (coderingsalgoritme) lid bestaat. Als het "enc" -lid bestaat, is het een JWE; anders is het een JWS.

JWS (getekend) ##

{
  "alg": "HS256"
}
 

JWE (gecodeerd)

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

JSON Web Encryption (JWE)

JSON Web Encryption (JWE) vertegenwoordigt gecodeerde inhoud met behulp van op JavaScript Object Notation (JSON) gebaseerde datastructuren. Het definieert een manier om uw claimgegevens te coderen, zodat alleen de beoogde ontvanger de informatie in een token kan lezen.

In de JWE JSON-serialisering wordt een JWE weergegeven als een JSON-object dat enkele of al deze acht leden bevat:

  "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)
 

De zes met base64url gecodeerde resultaatreeksen en de twee niet-beschermde JSON-objectwaarden worden weergegeven als leden binnen een JSON-object.

Voorbeeld JWE

Het volgende voorbeeld JWE Header verklaart dat:

  • de Content Encryption Key wordt gecodeerd naar de ontvanger met behulp van het RSA-PKCS1_1.5-algoritme om de JWE Encrypted Key te produceren
  • de platte tekst wordt gecodeerd met behulp van het AES-256-GCM-algoritme om de JWE-codetekst te produceren
  • de opgegeven 64-bits initialisatievector met de base64url-codering __79_Pv6-fg werd gebruikt
  • de vingerafdruk van het X.509-certificaat die overeenkomt met de sleutel die wordt gebruikt om de JWE te coderen, heeft de base64url-codering 7noOPq-hJ1_hCnvWh6IeYI2w9Q0.
{
 "alg":"RSA1_5",
 "enc":"A256GCM",
 "iv":"__79_Pv6-fg",
 "x5t":"7noOPq-hJ1_hCnvWh6IeYI2w9Q0"
}
 

Base64url die de bytes codeert van de UTF-8-weergave van de JWE-header levert deze gecodeerde JWE-headerwaarde op (met regeleinden alleen voor weergavedoeleinden):

eyJhbGciOiJSU0ExXzUiLA0KICJlbmMiOiJBMjU2R0NNIiwNCiAiaXYiOiJfXzc5
X1B2Ni1mZyIsDQogIng1dCI6Ijdub09QcS1oSjFfaENudldoNkllWUkydzlRMCJ
 

Lees JSON Web Encryption-specificatie (RFC 7516) voor meer informatie

Getekend JWT (JWS)

Een ondertekende JWT bevat een gecodeerde Base64 Url Safe-handtekening als derde component. Het algoritme dat wordt gebruikt om de handtekening te genereren, wordt aangegeven in de koptekst.

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
.eyJzdWIiOiJKb2huIERvZSIsImFkbWluIjp0cnVlLCJpYXQiOjE0NzAzNTM5OTQsImV4cCI6MTQ3MDM1NzYyNywianRpIjoiNmU0MDRiYTgtZjg4NS00ZDVmLWJmYTItZTNmNWEwODM4MGE0In0
.7CfBdVP4uKsb0cogYepCvMLm8rcpjBYW1XZzA-a5e44
 

hoofd

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

Deze JWT werd ondertekend met het HMAC-SHA256-algoritme, vandaar alg: HS256 .

payload

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

Deze JWT kan worden geverifieerd met de geheime notsosecret UTF-8.

Niet ondertekend JWT

Een niet-ondertekende JWT heeft de alg: none en een lege JWS-component (handtekening):

eyJhbGciOiJub25lIn0
.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ
.
 

De laatste punt geeft aan dat de handtekening leeg is.

hoofd

{
  "alg": "none"
}
 

payload

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

Wat te bewaren in een JWT

De JWT RFC heeft drie soorten claims:

  • Geregistreerde claims zoals sub , iss , exp of nbf

  • Publieke claims met openbare namen of namen geregistreerd door IANA die waarden bevatten die uniek moeten zijn, zoals email , address of phone_number . Zie volledige lijst

  • Particuliere claims die u in uw eigen context en waarden kunt gebruiken, kunnen botsen

Geen van deze claims is verplicht

Een JWT staat op zichzelf en moet de serversessie vermijden die de nodige gegevens biedt om de authenticatie uit te voeren (geen serveropslag en database-toegang nodig). Daarom kan role of permissions worden opgenomen in privéclaims van JWT.

Geregistreerde claims

De volgende claimnamen zijn geregistreerd in het IANA-register "JSON Web Token Claims" dat is ingesteld bij sectie 10.1.

  • iss (emittent): identificeert de opdrachtgever die de JWT heeft uitgegeven.
  • sub (onderwerp): identificeert de hoofdpersoon die het onderwerp is van de JWT. Moet uniek zijn
  • aud (doelgroep): identificeert de ontvangers waarvoor de JWT is bedoeld (array met strings / uri)
  • exp (vervaltijd): identificeert de vervaltijd (UTC Unix) waarna u dit token niet langer moet accepteren. Het zou na de uitgegeven tijd moeten zijn.
  • nbf (niet eerder): identificeert de UTC Unix-tijd waarvoor de JWT niet moet worden geaccepteerd
  • iat (uitgegeven om): identificeert het UTC Unix-tijdstip waarop de JWT werd uitgegeven
  • jti (JWT ID): biedt een unieke identificatie voor de JWT.

Voorbeeld

{
    "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"]
    }
}