funciona español como oauth-2.0 spring-security-oauth2

oauth 2.0 - español - ¿Cómo puedo revocar un token JWT?



oauth2 vs jwt español (5)

Aquí está la solución llamada como JWT viejo para el nuevo esquema de intercambio .

Debido a que no podemos invalidar el token emitido antes del tiempo de vencimiento, siempre usamos token de corto tiempo, como 30 minutos. Cuando el token expiró, usamos el token antiguo para intercambiar un token nuevo. El punto crítico es que un token antiguo solo puede intercambiar un token nuevo.

En el servidor de autenticación central, mantenemos una tabla como esta:

table auth_tokens( user_id, jwt_hash, expire )

user_id contenido en la cadena JWT. jwt_hash es un valor hash de una cadena JWT completa, como SHA256. El campo de caducidad es opcional.

El siguiente es el flujo de trabajo:

  1. El usuario solicita la API de inicio de sesión con nombre de usuario y contraseña, el servidor de autenticación emite un token y registra el token (agregue una fila en la tabla).
  2. Cuando el token expiró, el usuario solicitó la API de intercambio con el token anterior. En primer lugar, el servidor de autenticación valida el token anterior como normal, excepto la comprobación de caducidad, luego crea el valor de hash del token y luego busca la tabla anterior por ID de usuario:
    • Si el registro encontrado y user_id y jwt_hash coinciden, emita un nuevo token y actualice la tabla.
    • Si se encuentra el registro, pero user_id y jwt_hash no coinciden, significa que alguien ha usado el token intercambiado anteriormente. El token debe ser pirateado, eliminar registros por user_id y responder con información de alerta.
    • Si no se encuentra el registro, el usuario debe iniciar sesión nuevamente o solo ingresar la contraseña.
  3. cuando el uso cambie la contraseña o cierre sesión, elimine el registro por ID de usuario.

Para usar el token de manera continua, tanto el usuario legal como el hacker necesitan intercambiar nuevos tokens continuamente, pero solo uno puede tener éxito, cuando uno falla, ambos necesitan iniciar sesión nuevamente en el próximo momento de intercambio.

Entonces, si el pirata informático obtuvo el token, se puede usar por un corto tiempo, pero no se puede cambiar por uno nuevo si un usuario legal intercambió uno nuevo la próxima vez, porque el período de validez del token es corto. Es más seguro de esta manera.

Si no hay un hacker, el usuario normal también necesita intercambiar nuevos tokens periódicamente, como cada 30 minutos, esto es como iniciar sesión automáticamente. La carga adicional no es alta y podemos ajustar el tiempo de caducidad de nuestra aplicación.

fuente: http://www.jianshu.com/p/b11accc40ba7

Estoy usando los tokens Spring Security OAuth2 y JWT. Mi pregunta es: ¿Cómo puedo revocar un token JWT?

Como se menciona aquí http://projects.spring.io/spring-security-oauth/docs/oauth2.html , la revocación se realiza mediante token de actualización. pero no parece funcionar.


En general, la respuesta más fácil sería decir que no puede revocar un token JWT, pero eso simplemente no es cierto . La respuesta honesta es que el costo de respaldar la revocación de JWT es lo suficientemente grande como para no valer la mayoría de las veces o reconsiderar una alternativa a JWT.

Dicho esto, en algunos escenarios es posible que necesite JWT y la revocación inmediata de tokens, así que analicemos lo que se necesitaría, pero primero cubriremos algunos conceptos.

JWT ( Learn JSON Web Tokens ) solo especifica un formato de token, este problema de revocación también se aplicaría a cualquier formato utilizado en lo que generalmente se conoce como token autónomo o por valor. Me gusta la última terminología, porque hace un buen contraste con los tokens de referencia.

token por valor : la información asociada, incluida la vida útil del token, está contenida en el token en sí y la información puede verificarse como procedente de una fuente confiable (firmas digitales para el rescate)

token de referencia : la información asociada se guarda en el almacenamiento del lado del servidor que luego se obtiene utilizando el valor del token como clave; siendo almacenamiento del lado del servidor, la información asociada es implícitamente confiable

Antes del JWT Big Bang, ya manejábamos tokens en nuestros sistemas de autenticación; Era común que una aplicación creara un identificador de sesión en el inicio de sesión del usuario que luego se utilizaría para que el usuario no tuviera que repetir el proceso de inicio de sesión cada vez. Estos identificadores de sesión se usaron como índices clave para el almacenamiento del lado del servidor y si esto suena similar a algo que leyó recientemente, tiene razón, esto de hecho se clasifica como un token de referencia.

Usando la misma analogía, entender la revocación de tokens de referencia es trivial; simplemente eliminamos el almacenamiento del lado del servidor asignado a esa clave y la próxima vez que se proporcione la clave no será válida.

Para los tokens de valor, solo necesitamos implementar lo contrario. Cuando solicita la revocación del token, almacena algo que le permite identificar de manera única ese token para que la próxima vez que lo reciba pueda verificar adicionalmente si fue revocado. Si ya está pensando que algo como esto no escalará, tenga en cuenta que solo necesita almacenar los datos hasta el momento en que caduque el token y, en la mayoría de los casos, probablemente solo pueda almacenar un hash del token para que siempre ser algo de un tamaño conocido.

Como última nota y para centrar esto en OAuth 2.0, la revocación de tokens de acceso por valor no está estandarizada actualmente. No obstante, la revocación del token OAuth 2.0 establece específicamente que todavía se puede lograr siempre que el servidor de autorización y el servidor de recursos acuerden una forma personalizada de manejar esto:

En el primer caso ( tokens autocontenidos ), se puede usar alguna interacción de back-end (actualmente no estandarizada) entre el servidor de autorización y el servidor de recursos cuando se desea la revocación de token de acceso inmediato.

Si controla tanto el servidor de autorización como el servidor de recursos, esto es muy fácil de lograr. Por otro lado, si delega la función del servidor de autorización a un proveedor de la nube como Auth0 o un componente de terceros como Spring OAuth 2.0, lo más probable es que necesite abordar las cosas de manera diferente, ya que probablemente solo obtendrá lo que ya está estandarizado.

Una referencia interesante

Este artículo explica otra forma de hacerlo: Blacklist JWT Contiene algunas prácticas y patrones interesantes seguidos de RFC7523


Encontré una forma de resolver el problema, ¿Cómo caducar el token JWT ya generado usando Java?

En este caso, necesitamos usar cualquier DB o en memoria donde,

Paso 1: Tan pronto como el token se genere por primera vez para un usuario, guárdelo en una base de datos con el token y es el tiempo " emitido en () ".

Lo almacené en DB en este formato JSON,

Ej: { "username" : "username", "token" : "token", "issuedAt" : "issuedAt" }

Paso 2: una vez que obtenga una solicitud de servicio web para el mismo usuario con un token para validar, obtenga la marca de tiempo " emitida () " del token y compárela con la marca de tiempo emitida almacenada (DB / en memoria).

Paso 3: Si la marca de tiempo emitida almacenada es nueva (usando el método after () / before ()), devuelva que el token no es válido (en este caso, en realidad no estamos expirando el token pero dejamos de dar acceso a ese token).

Así es como resolví el problema.


Esto no responde exactamente a su pregunta con respecto al marco de Spring, pero aquí hay un artículo que habla sobre por qué si necesita la capacidad de revocar los JWT, es posible que no quiera ir con los JWT en primer lugar, y en su lugar use el regular, Fichas de portador opacas.

https://www.dinochiesa.net/?p=1388


Una forma de revocar un JWT es aprovechando un sistema de eventos distribuidos que notifica a los servicios cuando se han revocado los tokens de actualización. El proveedor de identidad difunde un evento cuando se revoca un token de actualización y otros servicios / backends escuchan el evento. Cuando se recibe un evento, los servicios / backends actualizan una memoria caché local que mantiene un conjunto de usuarios cuyos tokens de actualización han sido revocados.

Este caché se verifica cada vez que se verifica un JWT para determinar si el JWT debe ser revocado o no. Todo esto se basa en la duración de los JWT y el instante de vencimiento de los JWT individuales.

Este artículo, Revocando JWT , ilustra este concepto y tiene una aplicación de muestra en Github.