# JSON Web Token

JSON Web Token (JWT) és un estàndard obert per l'intercanvi de testimonis d'autenticació (tokens) en arquitectures client-servidor. Es fa en format JSON, en un entorn web, de forma segura i per verificar la identitat o el rol de l'usuari a la part client.
Per exemple, un client s'identifica com administrador en la seva interacció amb el servidor, que genera un testimoni, que és enviat al client. En endavant, el client el podrà enviar en totes les comunicacions per provar que efectivament, té drets d'administrador. Els successius cops que el servidor el rep, mirarà al seu repositori de testimonis per comprovar amb quin rol ha de tractar la invocació.

## Estructura

Un testimoni JWT ben format consisteix en 3 cadenes de caràcters codificades en Base64 i separades per un punt. Cadascuna de les cadenes deriva d'un JSON amb una llista de clams (propietats que el token està reivindicant per obtenir els accessos desitjats).
| Capçalera | { "alg": "HS256", "typ": "JWT" } | Identifica l'algorisme amb què ha estat generada la signatura HS256 indica que aquest testimoni és signat usant HMAC-SHA256. El més típic és usar els algorismes HMAC amb SHA-256 (HS256) i Signatura RSA amb SHA-256 (RS256). JWA (JSON Web Algorithms) {{RFC|7518}} n'introdueix més tant per autenticació com xifrat. |
| Contingut | { "identificacio": "admin", "iat": 1422779638 } | Conté les informacions que el client presenta. L'especificació JWT defineix set camps estàndards que acostumen a ser trobats aquí. També n'hi ha de personalitzats, segons quin sigui el propòsit del testimoni. En aquest exemple hi ha un clam estándard, Issued At Time (iat) i un de personalitzat (identificació). |
| Signatura | HMAC_SHA256( secret, base64urlEncoding(capçalera) + '.' + base64urlEncoding(cos) ) | Valida el testimoni de forma segura. El càcul consisteix a codificar la capçalera i el contingut, usant codificació RFC 4648 Base64url, i concatenant-los amb un punt al mig. El resultat és xifrat segons indica la capçalera. El Base64url Encoding és similar a Base64, però usa diferents caràcters no alfanumèrics i omet caràcters de completat (padding). |
Les tres parts són codificades separadament usant Base64url Encoding {{RFC|4648}}, i concatenades usant punts per produir el JWT:
Les dades de dalt i el secret de "secretkey" crea el testimoni:
El testimoni resultant pot ser passat fàcilment amb HTML i HTTP.

## Ús

L'usuari s'identifica correctament amb les seves credencials i li és retornat un JSON Web Token (testimoni) que es guarda. Això és diferent de l'enfocament habitual on el que rep és una cookie.

## Camps estàndards

| Codi | Nom | Descripció |
| Camps estàndard | Camps estàndard | |
| iss | Emissor | Identifica el responsable que ha emès el JWT |
| sub | Assumpte | L'usuari |
| aud | Audiència | Els destinataris |
| exp | Data de caducitat | Data de caducitat del JWT |
| nbf | No abans | Data d'inici |
| iat | Emès el | Data d'emissió |
| jti | identificador | Identificador únic, del testimoni, fins i tot entre usuaris diferents |
| Capçaleres emprades habitualment | Capçaleres emprades habitualment | |
| typ | Tipus de token | Si hi és, és recomanable que siguiJWT. |
| cty | Tipus de contingut | Si hi emprem signatura aniuada o xifrat, és recomanable que sigui JWT |
| alg | Algorisme d'autenticació del codi del missatge | L'emissor pot triar lliurement l'algorisme per verificar la signatura del testimoni |
| kid | ID de la clau | Una pista indicant quina clau fa servir per generar la signatura. El servidor compararà aquest valor amb una clau per tal de verificar que la signatura és vàlida i testimoni és autèntic. |
| x5c | Cadena de certificat x.509 | El servidor fa servir aquesta informació per verificar que la signatura és vàlida i el testimoni autèntic |
| x5u | Cadena de certificat URL x.509 | Una URL on el servidor pot anar a buscar una cadena de certificat corresponent a la clau privada usada per generar la signatura. El servidor fa servir aquesta informació per verificar que la signatura és vàlida i el testimoni autèntic |
| crit | Crític | Una llista de capçaleres que ha de ser entesa pel servidor per tal d'acceptar que el testimoni és vàlid |
| Codi | Nom | Descripció |

## Implementacions

Hi ha implementacions de JWT per molts llenguatges de programació i marcs de treball, entre ells:
* .NET (C# VB.Net etc)
* C
* Clojure
* GNU Common Lisp
* Dart
* Elixir
* Erlang
* Go
* Haskell
* Java
* JavaScript
* Lua
* Node.js
* OCaml
* Perl
* PHP
* PL/SQL
* PowerShell
* Python
* Racket
* Raku
* Ruby
* Rust
* Scala
* Swift

## Referències

* ↑ jwt-dotnet
* ↑ libjwt
* ↑ «liquidz/clj-jwt» (en anglès). [Consulta: 7 maig 2018].
* ↑ cljwt
* ↑ «bryanjos/joken» (en anglès). [Consulta: 7 maig 2018].
* ↑ «golang-jwt/jwt» (en anglès). [Consulta: 8 gener 2018].
* ↑ «jwt: JSON Web Token (JWT) decoding and encoding». [Consulta: 7 maig 2018].
* ↑ auth0/java-jwt
* ↑ «kjur/jsrsasign» (en anglès). [Consulta: 7 maig 2018].
* ↑ «SkyLothar/lua-resty-jwt» (en anglès). [Consulta: 7 maig 2018].
* ↑ «jsonwebtoken». [Consulta: 7 maig 2018].
* ↑ ocaml-jwt
* ↑ Crypt::JWT
* ↑ lcobucci/jwt
* ↑ Egan, Morten. «GitHub - morten-egan/jwt_ninja: PLSQL Implementation of JSON Web Tokens.», 07-02-2019. [Consulta: 14 març 2019].
* ↑ «SP3269/posh-jwt». [Consulta: 1r agost 2018].
* ↑ «jpadilla/pyjwt» (en anglès). [Consulta: 21 març 2017].
* ↑ net-jwt
* ↑ JSON-WebToken
* ↑ ruby-jwt
* ↑ frank_jwt
* ↑ jwt-scala