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 modifica

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:

const token = base64urlEncoding(capçalera) + '.' + base64urlEncoding(contingut) + '.' + base64urlEncoding(signatura)

Les dades de dalt i el secret de "secretkey" crea el testimoni:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI

El testimoni resultant pot ser passat fàcilment amb HTML i HTTP.

Ús modifica

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 modifica

Codi Nom Descripció
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
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 modifica

Hi ha implementacions de JWT per molts llenguatges de programació i marcs de treball, entre ells:

Referències modifica

  1. jwt-dotnet
  2. libjwt
  3. «liquidz/clj-jwt» (en anglès). [Consulta: 7 maig 2018].
  4. cljwt
  5. [1]
  6. «bryanjos/joken» (en anglès). [Consulta: 7 maig 2018].
  7. «golang-jwt/jwt» (en anglès). [Consulta: 8 gener 2018].
  8. «jwt: JSON Web Token (JWT) decoding and encoding». [Consulta: 7 maig 2018].
  9. auth0/java-jwt
  10. «kjur/jsrsasign» (en anglès). [Consulta: 7 maig 2018].
  11. «SkyLothar/lua-resty-jwt» (en anglès). [Consulta: 7 maig 2018].
  12. «jsonwebtoken». [Consulta: 7 maig 2018].
  13. ocaml-jwt
  14. Crypt::JWT
  15. lcobucci/jwt
  16. Egan, Morten. «GitHub - morten-egan/jwt_ninja: PLSQL Implementation of JSON Web Tokens.», 07-02-2019. [Consulta: 14 març 2019].
  17. «SP3269/posh-jwt». [Consulta: 1r agost 2018].
  18. «jpadilla/pyjwt» (en anglès). [Consulta: 21 març 2017].
  19. net-jwt
  20. JSON-WebToken
  21. ruby-jwt
  22. frank_jwt
  23. [2]
  24. jwt-scala
  25. [3]