Ir al contenido
Menú principal
Menú principal
mover a la barra lateral
ocultar
Navegación
Página principal
Cambios recientes
Página aleatoria
Ayuda sobre MediaWiki
Buscar
Buscar
español
Apariencia
Crear una cuenta
Acceder
Herramientas personales
No has accedido
Discusión
Contribuciones
Crear una cuenta
Acceder
Edición de «
JSON Web Token
»
Página
Discusión
español
Leer
Editar
Editar código
Ver historial
Herramientas
Herramientas
mover a la barra lateral
ocultar
Acciones
Leer
Editar
Editar código
Ver historial
General
Lo que enlaza aquí
Cambios relacionados
Información de la página
Apariencia
mover a la barra lateral
ocultar
Advertencia:
no has iniciado sesión. Tu dirección IP se hará pública si haces cualquier edición. Si
inicias sesión
o
creas una cuenta
, tus ediciones se atribuirán a tu nombre de usuario, además de otros beneficios.
Comprobación antispam. ¡
No
rellenes esto!
'''JSON Web Token''' (abreviado '''JWT''') es un [[estándar abierto]] basado en [[JSON]] propuesto por [[IETF]] (RFC 7519) para la creación de [[tokens de acceso]] que permiten la propagación de identidad y privilegios o ''claims ''en inglés. Por ejemplo, un servidor podría generar un token indicando que el usuario tiene privilegios de administrador y proporcionarlo a un cliente. El cliente entonces podría utilizar el token para probar que está actuando como un administrador en el cliente o en otro sistema. El token está firmado por la clave del servidor, así que el cliente y el servidor son ambos capaces de verificar que el token es legítimo. Los JSON Web Tokens están diseñados para ser compactos, poder ser enviados en las URLs -''URL-safe''- y ser utilizados en escenarios de [[Single Sign-On]] (SSO). Los privilegios de los JSON Web Tokens puede ser utilizados para propagar la identidad de usuarios como parte del proceso de [[autenticación]] entre un [[proveedor de identidad]] y un [[Proveedor de servicios|proveedor de servicio]], o cualquiera otro tipo de privilegios requeridos por procesos empresariales.<ref name="Bradley">{{Cita web|url=https://tools.ietf.org/html/rfc7519|título=JSON Web Token (JWT)|fechaacceso=14 de noviembre de 2016|apellido=John|nombre=Bradley|sitioweb=tools.ietf.org}}</ref><ref>{{Cita web|url=https://scotch.io/tutorials/the-anatomy-of-a-json-web-token|título=The Anatomy of a JSON Web Token|fechaacceso=8 de mayo de 2015|apellido=Sevilleja|nombre=Chris}}</ref><ref name=":0">{{Cite web|title=JSON Web Tokens - jwt.io|url=https://jwt.io/|website=jwt.io|accessdate=8 de mayo de 2015}}</ref><ref name="auth0">{{Cita web|url=https://www.chosenplaintext.ca/2015/03/31/jwt-algorithm-confusion.html|título=Critical vulnerabilities in JSON Web Token libraries|fechaacceso=29 de marzo de 2016|apellido=McLean|nombre=Tim|fecha=31 de marzo de 2015|editorial=Auth0}}</ref> El estándar de JWT se basa en otros estándares basados en JSON [[JSON Web Signature]] (RFC 7515) y [[JSON Web Encryption]] (RFC 7516) == Estructura == Los JSON Web Tokens generalmente están formados por tres partes: un encabezado o ''header'', un contenido o ''payload'', y una firma o ''signature''.<ref>{{Cita web|url=https://www.ionos.es/digitalguide/paginas-web/desarrollo-web/json-web-token-jwt/|título=Introducción a JSON Web Token (JWT)|fechaacceso=2022-10-31|sitioweb=IONOS Digital Guide|idioma=es}}</ref> El encabezado identifica qué algoritmo fue usado para generar la firma y normalmente se ve de la siguiente forma: header = '{"alg":"HS256","typ":"JWT"}' <code>HS256</code> indica que este token está firmado utilizando HMAC-SHA256. El contenido contiene la información de los privilegios o ''claims ''del token: payload = '{"loggedInAs":"admin","iat":1422779638}' El estándar sugiere incluir una marca temporal o [[timestamp]] en inglés, llamado <code>iat</code> para indicar el momento en el que el token fue creado. La firma está calculada codificando el encabezamiento y el contenido en base64url, concatenándose ambas partes con un punto como separador: key = 'secretkey' unsignedToken = encodeBase64Url(header) + '.' + encodeBase64Url(payload) signature = HMAC-SHA256(key, unsignedToken) En el token, las tres partes -encabezado, contenido y firma- están concatenadas utilizando puntos de la siguiente forma: token = encodeBase64Url(header) + '.' + encodeBase64Url(payload) + '.' + encodeBase64Url(signature) # token es: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI El token puede ser fácilmente transmitido en entornos [[HTML]] y [[Protocolo de transferencia de hipertexto|HTTP]], siendo similar a estándares basados en XML como [[Security Assertion Markup Language|SAML]]. Generalmente los algoritmos de cifrado utilizados son [[HMAC]] con [[SHA-2|SHA-256]] (HS256) y [[firma digital]] con [[SHA-2|SHA-256]] (RS256). == Uso == La autorización se logra cuando el usuario ingresa sus credenciales con éxito, entonces se genera un JSON Web Token que es retornado al cliente, quien tiene que guardarlo localmente, en vez del modelo tradicional de crear una sesión en el servidor y retornar una ''[[Cookie (informática)|cookie]]''. Siempre que el usuario quiere acceder a una ruta protegida o recurso, el cliente tiene que enviar el JWT, generalmente en el encabezado de <code>Authorization</code> utilizando el esquema <code>Bearer</code>. El contenido del encabezado HTTP se ve de la siguiente forma: : <code>Authorization: Bearer eyJhbGci''...<snip>...''yu5CSpyHI</code> Este es un mecanismo de autenticación sin estado - ''stateless''- ya que la sesión del usuario nunca se guarda en el proveedor de identidad o en el proveedor del servicio. Los recursos protegidos siempre comprobaran si existe un JWT válido en cada pedido de acceso. Si el token está presente y es válido, el proveedor del servicio otorga accesos a los recursos protegidos. Como los JWTs contienen toda la información necesaria en sí mismos, se reduce la necesidad de consultar la base de datos u otras fuentes de información múltiples veces. == Campos estándares == El estándar define los siguientes campos que pueden incluirse en los tokens JWT: {| class="wikitable" style="margin-bottom: 10px;" !Código !Nombre !Descripción |- |<code>iss</code> |Issuer |Identifica el proveedor de identidad que emitió el JWT |- |<code>sub</code> |Subject |Identifica el objeto o usuario en nombre del cual fue emitido el JWT |- |<code>aud</code> |Audience |Identifica la audiencia o receptores para lo que el JWT fue emitido, normalmente el/los servidor/es de recursos (e.g. la API protegida). Cada servicio que recibe un JWT para su validación tiene que controlar la audiencia a la que el JWT está destinado. Si el proveedor del servicio no se encuentra presente en el campo <code>aud</code>, entonces el JWT tiene que ser rechazado |- |<code>exp</code> |Expiration time |Identifica la marca temporal luego de la cual el JWT '''no '''<span>'''tiene '''que</span> ser aceptado. |- |<code>nbf</code> |Not before |Identifica la marca temporal en que el JWT comienza a ser válido. EL JWT '''no tiene''' que ser aceptado si el token es utilizando antes de este tiempo. |- |<code>iat</code> |Issued at |Identifica la marca temporal en qué el JWT fue emitido. |- |<code>jti</code> |JWT ID |Identificador único del token incluso entre diferente proveedores de servicio. |} Los campos siguientes pueden ser utilizados en el encabezado: {| class="wikitable" style="margin-bottom: 10px;" !Código !Nombre !Descripción |- |<code>typ</code> |Token type |Si está presente, se recomienda utilizar el valor <code>JWT</code>. |- |<code>cty</code> |Content type |En casos normales, no es recomendado. En casos de firma o cifrado anidado, '''debe''' estar presente y el valor debe ser <code>JWT</code>. |- |<code>alg</code> |Message authentication code algorithm |El proveedor de identidad puede elegir libremente el algoritmo para verificar la firma del token, aunque algunos de los algoritmos soportados son inseguros. |- | colspan="3" |Cualquiera de los otros campos introducidos por JWS y JWE. |} == Implementaciones == Algunas de las implementaciones de JWT que existen: * [[C (lenguaje de programación)|C]]<ref>[https://github.com/benmcollins/libjwt libjwt] on [//en.wikipedia.org/wiki/Github.com github.com]</ref> * [[Common Lisp]]<ref>[https://github.com/gschjetne/cljwt cljwt] on [//en.wikipedia.org/wiki/Github.com github.com]</ref> * [[Go (lenguaje de programación)|Go]]<ref>{{Cita web|url=https://github.com/dgrijalva/jwt-go|título=dgrijalva/jwt-go|fechaacceso=8 de enero de 2018|sitioweb=GitHub|idioma=en}}</ref> * [[Microsoft .NET|.NET]]<ref>[https://github.com/jwt-dotnet/jwt jwt-dotnet] on [//en.wikipedia.org/wiki/Github.com github.com]</ref> * [[Perl]]<ref>[https://metacpan.org/pod/Crypt::JWT Crypt::JWT] on [//en.wikipedia.org/wiki/Cpan.org cpan.org]</ref> * [[Perl 6|Perl6]]<ref>[https://github.com/jamesalbert/JSON-WebToken JSON-WebToken] on [//en.wikipedia.org/wiki/Github.com github.com]</ref> * [[PHP]]<ref>[https://github.com/lcobucci/jwt lcobucci/jwt] on [//en.wikipedia.org/wiki/Github.com github.com]</ref> * [[Python]]<ref>{{Cita web|url=https://github.com/jpadilla/pyjwt|título=jpadilla/pyjwt|fechaacceso=21 de marzo de 2017|sitioweb=GitHub|idioma=en}}</ref> * [[Ruby]]<ref>[https://github.com/jwt/ruby-jwt ruby-jwt] on [//en.wikipedia.org/wiki/Github.com github.com]</ref> * [[Rust (lenguaje de programación)|Rust]]<ref>[https://github.com/GildedHonour/frank_jwt frank_jwt] on [//en.wikipedia.org/wiki/Github.com github.com]</ref> * [[Scala (lenguaje de programación)|Scala]]<ref>[https://github.com/pauldijou/jwt-scala jwt-scala] on [//en.wikipedia.org/wiki/Github.com github.com]</ref> * [[Clojure]]<ref>{{Cita web|url=https://github.com/liquidz/clj-jwt|título=liquidz/clj-jwt|fechaacceso=28 de abril de 2018|sitioweb=GitHub|idioma=en}}</ref> * [[Elixir (lenguaje de programación)|Elixir]]<ref>{{Cita web|url=https://github.com/bryanjos/joken|título=bryanjos/joken|fechaacceso=28 de abril de 2018|sitioweb=GitHub|idioma=en}}</ref> * [[Erlang]]<ref>{{Cita web|url=https://github.com/artemeff/jwt|título=artemeff/jwt|fechaacceso=28 de abril de 2018|sitioweb=GitHub|idioma=en}}</ref> * [[Haskell]]<ref>{{Cita web|url=https://hackage.haskell.org/package/jwt-0.8.0/docs/Web-JWT.html|título=Web.JWT|fechaacceso=28 de abril de 2018|sitioweb=hackage.haskell.org}}</ref> * [[Java (lenguaje de programación)|Java]]<ref>[https://github.com/auth0/java-jwt auth0/java-jwt] on [//en.wikipedia.org/wiki/Github.com github.com]</ref> * [[JavaScript]]<ref>{{Cita web|url=https://github.com/auth0/jwt-decode|título=auth0/jwt-decode|fechaacceso=28 de abril de 2018|sitioweb=GitHub|idioma=en}}</ref> * [[Lua]]<ref>{{Cita web|url=https://github.com/SkyLothar/lua-resty-jwt|título=SkyLothar/lua-resty-jwt|fechaacceso=28 de abril de 2018|sitioweb=GitHub|idioma=en}}</ref> * [[Node.js]]<ref>{{Cita web|url=https://www.npmjs.com/package/jwt-js|título=jwt-js|fechaacceso=28 de abril de 2018|sitioweb=npm}}</ref> Puede encontrarse una lista detallada con las especificaciones de cada implementación en https://jwt.io/#libraries-io == Referencias == {{Listaref|30em}} == Enlaces externos == * [https://jwt.io/ jwt.io] @– Sitio web especializado sobre JWT con herramientas y documentación, mantenidos por Auth0 * [https://jwt.tool-kit.dev/ jwt tool] @– Herramienta JWT en línea y preguntas frecuentes * [https://codebeautify.org/jsonvalidator JSON Validator] Validar cadena de token web JSON {{Control de autoridades}} [[Categoría:Control de acceso informático]] [[Categoría:Identidad federada]] [[Categoría:JSON]]
Resumen:
Al guardar los cambios aceptas los
términos de uso
y liberas de forma irrevocable tu contribución conforme a los términos de las licencias
licencia CC BY-SA 4.0
y
GFDL
. Aceptas igualmente que un hipervínculo o URL es atribución suficiente conforme a la licencia Creative Commons.
Cancelar
Ayuda de edición
(se abre en una ventana nueva)
Buscar
Buscar
Edición de «
JSON Web Token
»
Añadir idiomas
Añadir tema