Saltar al contenido principal
Usar con Actions te permite configurar capacidades de detección y respuesta ante riesgos posteriores a la autenticación para proteger tus aplicaciones y usuarios frente a tokens de actualización comprometidos. También puedes personalizar dinámicamente las expiraciones del token de actualización. Para ello, las Actions de post-login incluyen dos objetos clave:
  • event.refresh_token: Proporciona información relevante sobre refresh_tokens existentes, como id, created_at, expires_at, idle_expires_at, clients_id, información del device, como ASN, IP y User_agent, y, en flujos basados en navegador, session_id. Este objeto se rellena en flujos de intercambio del token de actualización.
  • api.refreshToken: Te permite administrar tokens de actualización existentes revocando sesiones o cambiando las fechas de expiración.
Puedes usar el objeto event.refresh_token para revisar la propiedad last_exchange_at y evaluar los riesgos asociados con las transacciones actuales. También puedes combinar el objeto event.refresh_token con otros objetos de evento, como event.authentication. Después, puedes usar el objeto api.refreshToken para establecer fechas de expiración del token de actualización o revocar el token de actualización. Para obtener más información sobre estos objetos, consulta:
  • Objeto Event: Obtén información sobre el objeto Event del token de actualización y sus propiedades.
  • Objeto API: Obtén información sobre el objeto API del token de actualización y sus métodos.

Revocar tokens de actualización con Actions

El método api.refreshToken.revoke(reason) de post-login le permite responder a los riesgos asociados a una transacción. Al revocar el token de actualización, este se invalida, se devuelve un código de estado HTTP 403 para denegar la transacción actual y se registra un evento de revocación del token de actualización en los registros del inquilino (srrt).
Si desea usar el método api.refreshToken.revoke(reason), asegúrese de que exista el objeto event.refresh_token.

Supervise los eventos de revocación en los registros

La operación de revocación agrega el siguiente evento de registro en sus registros del inquilino: Un código de evento srrt que indica que se revocó un token de actualización. Si el token de actualización está vinculado a una sesión autenticada previamente, el registro incluirá una referencia a la sesión autenticada en el atributo session_id.

Cambiar las fechas de expiración de los tokens de actualización con Actions

Puede modificar las fechas de expiración de los tokens de actualización con los siguientes métodos de post-login:
  • api.refreshToken.setExpiresAt(absolute) le permite definir una nueva fecha de expiración absoluta para un token de actualización determinado.
  • api.refreshToken.setIdleExpiresAt(idle) le permite establecer una nueva fecha de expiración por tiempo de inactividad para un token de actualización determinado.
Puede usar estos métodos para personalizar dinámicamente la duración del token de actualización y las políticas de inactividad en función de lo siguiente:
  • La organización de un usuario
  • La conexión de Auth0 de un usuario
  • La pertenencia a grupos o el perfil de un usuario específico
  • La evaluación de riesgos
  • Cualquier otro criterio dinámico disponible durante la ejecución de la Action
Los métodos api.refreshToken.setExpiresAt(absolute) y api.refreshToken.setIdleExpiresAt(idle) permiten definir la expiración de un token de actualización antes de su emisión o modificar la expiración de un token de actualización existente durante un flujo de intercambio del token de actualización.Los métodos api.refreshToken.setExpiresAt(absolute) y api.refreshToken.setIdleExpiresAt(idle) convertirán los tokens de actualización sin expiración en tokens de actualización con expiración, usando la configuración predeterminada de expiración de tokens de actualización como valores máximos.El método api.refreshToken.setIdleExpiresAt(idle) establece el tiempo de espera por inactividad para los tokens de actualización. Si no se llama a este método en cada intercambio exitoso, el tiempo de espera por inactividad se sobrescribirá con la configuración de la aplicación para la duración del token de actualización.

Limitaciones

  • Los tokens de actualización emitidos a partir del 21-09-2023 (22-02-2024 para los inquilinos de la región US-3) contienen la propiedad de ID de sesión (session_id) con el valor correspondiente. Los tokens de actualización emitidos antes de esa fecha contienen esta propiedad con un valor null.
  • Los tokens de actualización emitidos antes del lanzamiento del método de API post-login api.refreshToken.revoke(reason) no contendrán información de event.refresh_token.device.
  • Los tokens de actualización que no expiran o que no se han intercambiado no contendrán la propiedad event.refresh_token.last_exchanged_at.
  • Por motivos de seguridad, los tiempos de espera por inactividad y absolutos no pueden establecerse por encima de la configuración de tokens de actualización de la aplicación definida en expiraciones de tokens de actualización. Si intenta establecer una fecha por encima de la configuración de expiración, los métodos de API actualizarán el valor hasta el definido en expiraciones de tokens de actualización y registrarán un evento de advertencia (w) en los registros del inquilino.
  • Tanto api.refreshToken.setExpiresAt() como api.refreshToken.setIdleExpiresAt() solo pueden acortar sus respectivas duraciones a partir de los valores actuales. No pueden ampliarlas ni aumentar la duración.

Casos de uso: Revocar un token de actualización

Puede usar Actions para configurar la detección de riesgos y revocar tokens de actualización mediante el método api.refreshToken.revoke(reason) y los objetos de evento.

Revocar tokens de actualización debido a ImpossibleTravel

Puede usar el objeto evaluaciones de para determinar si un usuario está iniciando sesión desde una ubicación que indica ImpossibleTravel y revocar el token de actualización actual asociado a la transacción.
exports.onExecutePostLogin = async (event, api) => {
  const { riskAssessment } = event.authentication ?? {};
  const ImpossibleTravel = riskAssessment?.assessments.ImpossibleTravel;

  // Si se trata de un viaje imposible y de un intercambio del token de actualización
  if (ImpossibleTravel?.code === "impossible_travel_from_last_login") {
    if (event.refresh_token) {
      api.refreshToken.revoke("Refresh token revoked due to impossible travel");
    }
  }
};
En este ejemplo, se realiza una comprobación al inicio de la Action para verificar que event.authentication.ImpossibleTravel.code sea igual a la propiedad impossible_travel_from_last_login. Si es true, la Action llama a api.refreshToken.revoke() para:
  • Denegar la transacción
  • Revocar el Token de actualización
  • Devolver un error access_denied con respuesta 403
  • Emitir el error “Se revocó el token de actualización debido a un viaje imposible”

Revocar tokens de actualización por vinculación de IP

Si usa las propiedades del objeto post-login event.refresh_token.device.initial_ip y event.request.ip para garantizar que una transacción de token de actualización se mantenga en la misma dirección IP durante toda su vigencia. En este caso, cualquier cambio de IP se considera un riesgo y requiere un nuevo token de actualización.
exports.onExecutePostLogin = async (event, api) => {
  const refreshTokenInitialIp = event.refresh_token?.device?.initial_ip;
  const requestCurrentIp = event.request.ip;

  // si hay un token de actualización y la IP cambia
  if (
    refreshTokenInitialIp &&
    requestCurrentIp &&
    refreshTokenInitialIp != requestCurrentIp
  ) {
    api.refreshToken.revoke("Invalid IP change");
  }
};
En este ejemplo, se realiza una comprobación al inicio de la Action para llevar un registro de las direcciones IP mediante las propiedades event.refresh_token.device.initial_ip y event.request.ip. La Action determina si la dirección IP de la transacción ha cambiado. Si es true, la Action llama a api.refreshToken.revoke() para:
  • Denegar la transacción
  • Revocar el token de actualización
  • Devolver una respuesta 403 con el error access_denied
  • Generar el error “Invalid IP change
Como alternativa, para una Action menos restrictiva, puede realizar un seguimiento de las propiedades event.request.asn y event.refresh_token.device.initial_asn para supervisar cambios de ASN en lugar de cambios de IP.

Casos de uso: Personalizar las fechas de expiración del Token de actualización

Puede usar Actions para personalizar la duración y las fechas de inactividad del Token de actualización. En concreto, puede configurar las fechas de expiración absoluta y por inactividad del Token de actualización para una transacción específica mediante los métodos post-login api.refreshToken.setExpiresAt(absolute) y api.refreshToken.setIdleExpiresAt(idle).

Personaliza la fecha de expiración absoluta del Token de actualización según la Organización

Puedes usar una Action de post-login para definir la duración del Token de actualización por Organización. En el siguiente ejemplo, se usan los metadatos refresh_token_timeout de la Organización para establecer la fecha de expiración del Token de actualización.
exports.onExecutePostLogin = async (event, api) => {
  // Metadatos de timeout del token de actualización (en milisegundos) configurados en las organizaciones
  const organization_refresh_token_lifetime =
    event.organization?.metadata?.refresh_token_timeout;

  if (organization_refresh_token_lifetime) {
    // El token de actualización ya existe
    if (event.refresh_token) {
      const created = Date.parse(event.refresh_token.created_at);

      const new_expiration_time =
        created + Number(organization_refresh_token_lifetime);
      api.refreshToken.setExpiresAt(new_expiration_time);
    } else {
      // El token de actualización aún no existe (p. ej., el token se está emitiendo)
      const current_time = new Date().getTime();

      const new_expiration_time =
        current_time + Number(organization_refresh_token_lifetime);
      api.refreshToken.setExpiresAt(new_expiration_time);
    }
  }
};
En este ejemplo, si hay un tiempo de expiración absoluto específico definido para una Organización, la Action establece el tiempo de expiración absoluto del token de actualización de modo que sea igual a:
  • Tokens recién emitidos: current_time más organization_refresh_token_lifetime
  • Tokens existentes: event.refresh_token.created_at más organization_refresh_token_lifetime

Personalizar el tiempo de inactividad del Token de actualización según el rol de pertenencia

Puede usar una Action de post-login para definir el tiempo de inactividad de un Token de actualización mediante aplicación y metadatos del usuario. En el siguiente ejemplo, se usan los roles de los metadatos del usuario para definir el rol de pertenencia del usuario y los metadatos de la aplicación para definir el tiempo de inactividad esperado del Token de actualización.
exports.onExecutePostLogin = async (event, api) => {
  // los administradores tienen configurado un tiempo de inactividad más corto para los tokens de actualización, en los metadatos de la aplicación
  const max_idle_lifetime =
    event.client.metadata?.admin_refresh_token_idle_timeout;

  // Verificar el atributo de roles en los metadatos de la aplicación del usuario para determinar si es un administrador.
  const isAdmin = event.user?.app_metadata?.roles?.find(
    (role) => role === "admin",
  );

  // Si la aplicación tiene un tiempo de inactividad específico definido, establecer el timeout
  if (max_idle_lifetime && isAdmin) {
    const current_time = new Date().getTime();

    api.refreshToken.setIdleExpiresAt(current_time + Number(max_idle_lifetime));
  }
};
En este ejemplo, si hay un tiempo de inactividad específico definido para la aplicación y el usuario es un Admin, la Action establece el tiempo de inactividad del token de actualización para que sea igual a current_time más refresh_token_idle_timeout. Ten en cuenta que estamos cambiando este tiempo de inactividad tanto para los tokens recién emitidos como para los existentes durante el intercambio del token de actualización.