oauth-2.0 - realms - openid connect library
¿Cuál es la intención del tiempo de caducidad del token de ID en OpenID Connect? (7)
En OpenID Connect, un token de acceso tiene un tiempo de caducidad. Para el flujo de código de autorización, esto suele ser corto (por ejemplo, 20 minutos), después de lo cual se usa el token de actualización para solicitar un nuevo token de acceso.
El token de ID también tiene un tiempo de caducidad. Mi pregunta es ¿cuál es la intención de esto?
Cualquier tiempo de caducidad del token de ID inferior al tiempo de caducidad del token de actualización significará que eventualmente tendrá un token de ID caducado, pero un token de acceso válido.
Así que estás destinado a:
- dar a su token de identificación una caducidad mayor que la caducidad del token de actualización, o
- configúrelo en el mismo vencimiento que el token de acceso y realice alguna acción (¿qué?) cuando caduque, o
- solo consume el token de ID en su cliente en el recibo, luego ignora el tiempo de expiración después de eso?
La especificación de OpenID Connect simplemente dice que al validar un token de ID,
"The current time MUST be before the time represented by the exp Claim."
que (posiblemente) es compatible con la tercera opción anterior.
EDITAR
Como OpenID Connect se basa en OAuth2, la respuesta a la pregunta complementaria a continuación se puede encontrar en la especificación OAuth2 que dice:
expires_in
RECOMMENDED. The lifetime in seconds of the access token.
Una pregunta relacionada es cuando intercambias un código de autorización por los tokens, la misma especificación dice que podrías obtener una respuesta como:
{
"access_token": "SlAV32hkKG",
"token_type": "Bearer",
"refresh_token": "8xLOxBtZp8",
"expires_in": 3600,
"id_token": "eyJhbG[...]"
}
Pero, ¿qué se relaciona con "expires_in" en este caso? ¿El token de acceso, el token de actualización o el token de ID?
(Para información, IdentityServer3 establece esto al tiempo de caducidad del token de acceso).
TLDR;
Valide el token de ID antes de confiar en lo que dice.
Más detalles
¿Cuál es la intención del tiempo de caducidad del token de ID en OpenID Connect?
La intención es permitir que el cliente valide el token de ID, y el cliente debe validar el token de ID antes de las operaciones que utilizan la información del token de ID .
De la especificación de flujo implícito de OpenID :
Si alguno de los procedimientos de validación definidos en este documento falla, cualquier operación que requiera que la información que no se validó correctamente DEBE abortarse y la información que no se haya validado NO DEBE usarse.
Para corroborar eso, la documentación de OpenID Connect de Google dice esto sobre la validación del token de ID:
Una cosa que hace que los tokens de identificación sean útiles es el hecho de que puede pasarlos por diferentes componentes de su aplicación. Estos componentes pueden usar un token de ID como un mecanismo de autenticación ligero que autentica la aplicación y el usuario. Pero antes de poder usar la información en el token de ID o confiar en ella como una afirmación de que el usuario se ha autenticado, debe validarla.
Por lo tanto, si nuestra aplicación cliente va a realizar alguna acción en función del contenido del token de ID, debemos validar nuevamente el token de ID.
Actualizar un token significa que puede usarlo nuevamente para solicitar algo al servidor de autorización (en este caso, el OP, el proveedor de OpenID-Connect) INCLUSO CUANDO EL USUARIO NO ESTÁ REGISTRADO. Normalmente, esto se permite solo para recursos limitados, y solo después de que el usuario haya iniciado sesión y se haya autenticado al menos una vez. Los tokens de actualización también deberían estar limitados en el tiempo.
En el flujo implícito de OIDC , se llama el punto final de Autorización,
y reciba el token de ID en la respuesta junto con todos los ámbitos y en ellos toda la información de las reclamaciones.
Las llamadas posteriores a una API se deben realizar con el flujo de código .
El flujo implícito está destinado a habilitar una aplicación solo para javascript o solo para el navegador. No es una aplicación que interactúa con un servidor.
Por lo tanto, incluso si hubiera una forma de "actualizar" este token, no debería, por lo que respecta a la seguridad, dejarlo vivir por mucho tiempo. Será robado y reutilizado por usuarios no autorizados que se hacen pasar por la identificación. Debes forzar un nuevo inicio de sesión para eso.
En el flujo de código, usted llama al punto final de Autorización del OP y recibe un Código de Autorización (también denominado token de autorización, o authcode para abreviar). Esto debería expirar de manera similar al id_token que recibió en un flujo implícito, por las mismas razones y no puede y no debe ser renovado.
Su UI o aplicación luego llama al punto final del token del OP, y recibe (a veces después del consentimiento adicional del usuario a través de una UI para permitir el uso de sus recursos propios en el servidor del OP) tanto:
- Un id_token, para la autenticación, que nunca debe usarse de nuevo en las llamadas del servidor, excepto como una sugerencia durante el cierre de sesión, cuando su caducidad ya no es importante, por lo que, por los motivos anteriores, se debe dejar que caduque y nunca se actualice.
- Un access_token - que más adelante, cuando se llama a una API, se puede dar al punto final de UserInfo del OP. Eso devolverá las reclamaciones, y la API puede autorizar en consecuencia.
Puede actualizar este access_token, ya que solo le dice a la API qué reclamos tiene el usuario y qué recursos (por alcance y reclamos de cada alcance) que el usuario aceptó darle. Como se explicó anteriormente, esto es para permitir el acceso incluso después de que el usuario ya no haya iniciado sesión. Por supuesto, nunca desea permitir que se actualice el id_token, porque no desea permitir la suplantación de identidad sin iniciar sesión.
Es la misma intención: no puede utilizar el id_token
después de que id_token
. La principal diferencia es que un id_token
es una estructura de datos y no necesitará llamar a ningún servidor o punto final, ya que la información está codificada en el token. Un access_token
normal access_token
ser un artefacto opaco (como un GUID).
El consumidor de id_token
siempre debe verificar la validez (tiempo) de la misma.
No estoy 100% familiarizado con IS, pero supongo que es un campo de conveniencia. Siempre debe comprobar el reclamo exp
.
La caducidad es solo una de las validaciones.
id_token
s también están firmados digitalmente y eso también es una validación que debe realizar.
Estoy respondiendo a mi propia pregunta, ya que he descubierto que algunas de las suposiciones detrás de mi pregunta eran erróneas, por lo que es más fácil de aclarar aquí, en lugar de volver a escribir la pregunta.
Un token de identificación está destinado a demostrar a un cliente que el usuario se ha autenticado y quiénes son como resultado.
Cuando un Cliente recibe un token de ID, generalmente hará algo como convertirlo en una ClaimsIdentity, y persistirá esto, por ejemplo, utilizando una cookie.
El token de ID debe estar sin caducar en este punto de uso (que debería ser, ya que se acaba de emitir). Pero después de esto, no se vuelve a utilizar, por lo que no importa si caduca mientras el usuario todavía tiene una sesión activa. El cliente tiene la información de autenticación que necesita y, a su vez, puede elegir su propia política según la duración de la sesión antes de que el usuario tenga que iniciar sesión nuevamente.
Mi suposición errónea al hacer la pregunta era que un token de ID y un token de acceso deberían usarse juntos, y por lo tanto ambos debían tener fechas de caducidad válidas. Esto es incorrecto por varias razones:
- Los tokens de identificación son solo para autenticar a un Cliente (como se describe anteriormente).
- Los tokens de acceso no tienen nada que ver con los Clientes. Son para acceder a los recursos y un Cliente solo los maneja si a su vez necesita llamar a un recurso.
- Algo así como una aplicación MVC o WebForms independiente solo necesita un token de ID. Si no está llamando a un recurso externo, no hay nada a lo que otorgar acceso, por lo que no hay token de acceso.
Quería publicar esta respuesta como un comentario, pero como no he sido muy activo en , supongo que lo estoy publicando como una respuesta alternativa.
También usa id_token
como id_token_hint
cuando intenta cerrar la sesión del usuario http://openid.net/specs/openid-connect-session-1_0.html . Sinceramente, no creo que realmente importe si el id_token
está caducado en este momento, ya que solo le preocupa desconectarse de un usuario en particular.
Si entiendo correctamente, de acuerdo con this y con la especificación OpenID Connect Core 1.0 , el token de identificación en sí puede almacenarse en las cookies como un mecanismo para persistir las sesiones, y enviarse con cada solicitud de autenticación al Cliente. Luego, el Cliente puede verificar el token de ID localmente o a través del punto final del verificador del Proveedor (si se proporciona, como lo hace Google ). Si el token ha caducado, debe realizar otra solicitud de autenticación, excepto esta vez con prompt=none
en el parámetro de URL. También asegúrese de enviar el token de ID caducado en el parámetro id_token_hint
, de lo contrario, el proveedor puede devolver un error.
Por lo tanto, parece natural que el token de ID caduque, pero prompt=none
garantiza que el nuevo token de ID se pueda obtener sin problemas sin la intervención del usuario (a menos que, por supuesto, el usuario cierre la sesión de OpenID).
Tuve que profundizar en esto por mis propias razones y lo escribí, así que publicaré lo que aprendí aquí ...
Primero, responderé a la pregunta con el riesgo de indicar lo obvio: no se puede confiar en el token de ID y su contenido debe ignorarse si la hora actual es mayor que la expirada. La respuesta del interrogador indica que después de la autenticación inicial del usuario, el token de ID no se vuelve a utilizar. Sin embargo, dado que el token de ID está firmado por el proveedor de identidad, ciertamente podría ser útil en cualquier momento para proporcionar una manera de determinar de manera confiable quién es el usuario a otros servicios que una aplicación podría estar usando. El uso de una ID de usuario o dirección de correo electrónico simple no es confiable porque se puede falsificar fácilmente (cualquiera puede enviar una dirección de correo electrónico o ID de usuario), pero ya que el Servidor de Autorización firma un token de ID de OIDC (que también suele tener la ventaja de ser un tercero) no puede ser falsificado y es un mecanismo de autenticación mucho más confiable.
Por ejemplo, una aplicación móvil puede querer poder decirle a un servicio backend quién es el usuario que está usando la aplicación y puede que tenga que hacerlo después del breve período posterior a la autenticación inicial, momento en el que caduca el token de ID. y por lo tanto, no se puede utilizar para autenticar al usuario de manera confiable.
Por lo tanto, al igual que el token de acceso (utilizado para la autorización, especificar los permisos que tiene el usuario) se puede actualizar, ¿ puede actualizar el token de ID (usado para la autenticación) especificando quién es el usuario? De acuerdo con la especificación OIDC, la respuesta no es obvia. En OIDC / OAuth hay tres "flujos" para obtener tokens, el flujo del Código de Autorización, el flujo Implícito y el flujo Híbrido (que se omitirá a continuación porque es una variante de los otros dos).
Para el flujo implícito en OIDC / OAuth, usted solicita el token de ID en el punto final de la autorización redireccionando al usuario en el navegador al punto extremo de autorización e incluyendo id_token
como el valor del parámetro de solicitud de tipo de response_type
. Se REQUIERE una respuesta de autenticación exitosa de flujo implícito para incluir el id_token
.
Para el flujo del Código de autenticación , el cliente especifica el code
como el valor del parámetro de solicitud de tipo de response_type
cuando se redirige al usuario al punto final de autorización. Una respuesta exitosa incluye un código de autorización. El cliente cliente realiza una solicitud al punto extremo del token con el código de autorización y, de acuerdo con la Sección 3.1.3.3 del OIDC Core, Respuesta exitosa del token, la respuesta DEBE incluir un token de ID .
Entonces, para cualquiera de los flujos, así es como se obtiene inicialmente el token de ID, pero ¿cómo se actualiza? La Sección 12 de OIDC: el uso de tokens de actualización tiene la siguiente declaración sobre la Respuesta del token de actualización:
Luego de la validación exitosa del token de actualización, el cuerpo de la respuesta es la respuesta del token de la Sección 3.1.3.3, excepto que podría no contener un id_token .
Es posible que no contenga un token de ID y, como no hay una forma específica para obligarlo a incluir el token de ID, debe asumir que la respuesta no contendrá el token de ID. Por lo tanto, técnicamente no hay una forma específica de "actualizar" un token de ID utilizando un token de actualización. Por lo tanto, la única forma de obtener un nuevo identificador de ID es volver a autorizar / autenticar al usuario redirigiendo al usuario al punto final de autorización e iniciando el flujo implícito o el flujo del código de autenticación como se describe anteriormente. La especificación OIDC agrega un parámetro de solicitud de solicitud a la solicitud de autorización, por lo que el cliente puede solicitar que el servidor de autorización no le solicite al usuario ninguna IU, pero la redirección aún tiene que suceder.