JSON Web Token
JSON Web Token (JWT) és un estàndard obert que permet 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 i li retorna 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
Capçalera |
{ "alg": "HS256", "typ": "JWT" } |
Identifica l'algorisme amb què ha estat generada la signatura
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. |
---|---|---|
Cos |
{ "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 nom estándard, Issued At Time claim ( |
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 cos, 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(cos) + '.' + 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
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'enfoc habitual on el que rep és una cookie.
Camps estàndards
Codi | Nom | Descripció |
---|---|---|
Camps estàndard | ||
iss
|
Issuer | Identifica la companyia que ha emès el JWT |
sub
|
Subject | L'usuari |
aud
|
Audience | Els destinataris |
exp
|
Expiration Time | Data de caducitat del JWT |
nbf
|
Not Before | Data d'inici |
iat
|
Issued at | Data d'emissió |
jti
|
JWT ID | Identificador únic, del testimoni, fins i tot entre usuaris diferents |
Capçaleres emprades habitualment | The following fields are commonly used in the header of a JWT | |
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 | La companyia 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
Les implementacions de JWT existeixen per molts idiomes marc de treball, incloent (però no només):
- .NET (C# VB.Net etc)[1]
- C[2]
- Clojure[3]
- GNU Common Lisp[4]
- Dart[5]
- Elixir[6]
- Erlang
- Go[7]
- Haskell[8]
- Java[9]
- JavaScript[10]
- Lua[11]
- Node.js[12]
- OCaml[13]
- Perl[14]
- PHP[15]
- PL/SQL[16]
- PowerShell[17]
- Python[18]
- Racket[19]
- Raku[20]
- Ruby[21]
- Rust[22] [23]
- Scala[24]
- Swift[25]
Referències
- ↑ jwt-dotnet
- ↑ libjwt
- ↑ «liquidz/clj-jwt» (en anglès). GitHub. [Consulta: 7 maig 2018].
- ↑ cljwt
- ↑ [1]
- ↑ «bryanjos/joken» (en anglès). GitHub. [Consulta: 7 maig 2018].
- ↑ «golang-jwt/jwt» (en anglès). GitHub. [Consulta: 8 gener 2018].
- ↑ «jwt: JSON Web Token (JWT) decoding and encoding». Hackage. [Consulta: 7 maig 2018].
- ↑ auth0/java-jwt
- ↑ «kjur/jsrsasign» (en anglès). GitHub. [Consulta: 7 maig 2018].
- ↑ «SkyLothar/lua-resty-jwt» (en anglès). GitHub. [Consulta: 7 maig 2018].
- ↑ «jsonwebtoken». npm. [Consulta: 7 maig 2018].
- ↑ ocaml-jwt
- ↑ Crypt::JWT
- ↑ lcobucci/jwt
- ↑ Egan, Morten (2019-02-07), GitHub - morten-egan/jwt_ninja: PLSQL Implementation of JSON Web Tokens., <https://github.com/morten-egan/jwt_ninja>. Consulta: 14 març 2019
- ↑ «SP3269/posh-jwt». GitHub. [Consulta: 1r agost 2018].
- ↑ «jpadilla/pyjwt» (en anglès). GitHub. [Consulta: 21 març 2017].
- ↑ net-jwt
- ↑ JSON-WebToken
- ↑ ruby-jwt
- ↑ frank_jwt
- ↑ [2]
- ↑ jwt-scala
- ↑ [3]