Actualizaciones de FedCM: API de estado de acceso, API de Error y API de marcas seleccionadas automáticamente

Chrome 120 está implementando la API de estado de acceso para FedCM. La API de estado de acceso (antes conocida como API de estado de acceso de IdP) permite que los sitios web, en particular los proveedores de identidad, le indiquen al navegador cuándo sus usuarios acceden y salen. El FedCM usa este indicador para abordar un problema de ataque de tiempo silencioso y, al hacerlo, permite que funcione sin cookies de terceros. Esta actualización aborda los últimos cambios restantes que son incompatibles con versiones anteriores y que identificamos anteriormente en el intent de envío original de FedCM, como parte de nuestro alcance del trabajo.

Si bien la API de estado de acceso mejora la propiedad de privacidad y la usabilidad, es un cambio incompatible con versiones anteriores una vez enviado. Si ya tienes una implementación de FedCM, asegúrate de actualizarla con las siguientes instrucciones.

Además, Chrome enviará dos nuevas funciones de Administración de credenciales federadas (FedCM):

  • API de Error: Notifica a los usuarios cuando su intento de acceso falle con una IU nativa basada en la respuesta del servidor del extremo de aserción de ID, si existe.
  • API de marcas de selección automática: Notifica al proveedor de identidad (IdP) y al usuario de confianza (RP) si se seleccionó automáticamente una credencial en el flujo.

API de estado de acceso

La API de estado de acceso es un mecanismo en el que un sitio web, en especial un IdP, informa al navegador el estado de acceso del usuario en el IdP. Con esta API, el navegador puede reducir las solicitudes innecesarias al IdP y mitigar posibles ataques de tiempo.

Informa al navegador sobre el estado de acceso del usuario

Los IdP pueden indicar el estado de acceso del usuario al navegador mediante el envío de un encabezado HTTP o una llamada a una API de JavaScript cuando el usuario accede en el IdP o cuando sale de todas sus cuentas de IdP. Para cada IdP (identificado por su URL de configuración), el navegador mantiene una variable de tres estados que representa el estado de acceso con valores posibles logged-in, logged-out y unknown. El estado predeterminado es unknown.

Para indicar que el usuario accedió, envía un encabezado HTTP Set-Login: logged-in en una navegación de nivel superior o una solicitud de subrecursos de mismo origen:

Set-Login: logged-in

Como alternativa, llama a la API de JavaScript navigator.login.setStatus('logged-in') desde el origen del IdP:

navigator.login.setStatus('logged-in');

Estas llamadas registran el estado de acceso del usuario como logged-in. Cuando el estado de acceso del usuario se establece en logged-in, el RP que llama a FedCM realiza solicitudes al extremo de la lista de cuentas del IdP y muestra las cuentas disponibles al usuario en el diálogo de FedCM.

Para indicar que el usuario salió de todas sus cuentas, envía el encabezado HTTP Set-Login: logged-out en una navegación de nivel superior o una solicitud de subrecursos de mismo origen:

Set-Login: logged-out

Como alternativa, llama a la API de JavaScript navigator.login.setStatus('logged-out') desde el origen del IdP:

navigator.login.setStatus('logged-out');

Estas llamadas registran el estado de acceso del usuario como logged-out. Cuando el estado de acceso del usuario es logged-out, la llamada a FedCM falla de forma silenciosa sin realizar una solicitud al extremo de la lista de cuentas del IdP.

El estado unknown se establece antes de que el IdP envíe una señal mediante la API de estado de acceso. Presentamos este estado para una mejor transición, porque es posible que un usuario ya haya accedido al IdP cuando enviamos esta API. Es posible que el IdP no tenga la oportunidad de indicar esto al navegador antes de que se invoque FedCM por primera vez. En este caso, hacemos una solicitud al extremo de la lista de cuentas del IdP y actualizamos el estado en función de la respuesta del extremo de la lista de cuentas:

  • Si el extremo muestra una lista de cuentas activas, actualiza el estado a logged-in y abre el diálogo de FedCM para mostrar esas cuentas.
  • Si el extremo no muestra cuentas, actualiza el estado a logged-out y falla la llamada de FedCM.

¿Qué sucede si vence la sesión del usuario? Permite que el usuario acceda a través de un flujo de acceso dinámico.

Aunque el IdP informa el estado de acceso del usuario al navegador, el estado podría no estar sincronizado, como cuándo vence la sesión. El navegador intenta enviar una solicitud con credenciales al extremo de la lista de cuentas cuando el estado de acceso es logged-in, pero el servidor no muestra cuentas porque la sesión ya no está disponible. En ese caso, el navegador puede permitir de forma dinámica que el usuario acceda al IdP a través de una ventana de diálogo.

En el diálogo de FedCM, se muestra un mensaje en el que se sugiere un acceso, como se muestra en la siguiente imagen.

Diálogo de FedCM que sugiere acceder al IdP
Un diálogo de FedCM que sugiere acceder al IdP

Cuando el usuario hace clic en el botón Continuar, el navegador abre un diálogo para la página de acceso del IdP.

Diálogo de ejemplo.
Diálogo de ejemplo que se muestra después de hacer clic en el botón para acceder al IdP.

La URL de la página de acceso se especifica con login_url como parte del archivo de configuración de IdP.

{
  "accounts_endpoint": "/auth/accounts",
  "client_metadata_endpoint": "/auth/metadata",
  "id_assertion_endpoint": "/auth/idtokens",
  "login_url": "/login"
  }
}

El diálogo es una ventana normal del navegador con cookies propias. Lo que ocurra dentro del diálogo depende del IdP, y no hay controladores de ventana disponibles para realizar una solicitud de comunicación de origen cruzado a la página de la parte restringida. Después de que el usuario accede, el IdP debe hacer lo siguiente:

  • Envía el encabezado Set-Login: logged-in o llama a la API de navigator.login.setStatus("logged-in") para informar al navegador que el usuario accedió.
  • Llama a IdentityProvider.close() para cerrar el diálogo.
Un usuario accede a un RP después de acceder al IdP con FedCM.
Un usuario accede a un RP después de acceder al IdP con FedCM.

Puedes probar el comportamiento de la API de estado de acceso en nuestra demostración.

  1. Presiona el botón Ir al IdP y acceder.
  2. Accede con una cuenta arbitraria.
  3. Selecciona Sesión vencida en el menú desplegable Estado de la cuenta.
  4. Presiona el botón Actualizar información personal.
  5. Presiona el botón Visitar la parte restringida para probar FedCM.

Deberías poder observar el acceso al IdP a través del comportamiento del módulo.

API de Error

Cuando Chrome envía una solicitud al extremo de aserción de ID (por ejemplo, cuando un usuario hace clic en el botón Continuar como en la IU de FedCM o se activa la reautenticación automática), es posible que el IdP no pueda emitir un token por motivos legítimos. Por ejemplo, si el cliente no está autorizado, el servidor no está disponible temporalmente, y así sucesivamente. Actualmente, Chrome falla la solicitud de manera silenciosa en caso de tales errores y solo notifica al RP rechazando la promesa.

Con la API de Error, Chrome notifica al usuario con una IU nativa con la información del error que proporciona el IdP.

Diálogo de FedCM que muestra el mensaje de error después de que falla el intento de acceso del usuario La cadena está asociada con el tipo de error.
Un diálogo de FedCM que muestra el mensaje de error después de que falla el intento de acceso del usuario La string está asociada con el tipo de error.

API HTTP de IdP

En la respuesta id_assertion_endpoint, el IdP puede mostrar un token al navegador si se puede emitir a pedido. En esta propuesta, en caso de que no se pueda emitir un token, el IdP puede mostrar una respuesta de “error”, que tiene dos campos opcionales nuevos:

  1. code
  2. url
// id_assertion_endpoint response
{
  "error": {
     "code": "access_denied",
     "url": "https://idp.example/error?type=access_denied"
  }
}

Para el código, el IdP puede elegir uno de los errores conocidos de la lista de errores especificados de OAuth 2.0 [invalid_request, unauthorized_client, access_denied, server_error y temporarily_unavailable] o usar cualquier string arbitraria. De lo contrario, Chrome renderiza la IU de error con un mensaje de error genérico y pasa el código al RP.

En el caso de url, identifica una página web legible con información sobre el error para proporcionar información adicional a los usuarios. Este campo es útil para los usuarios porque los navegadores no pueden proporcionar mensajes de error enriquecidos en una IU nativa. Por ejemplo, vínculos para los próximos pasos, información de contacto de atención al cliente, etcétera. Si un usuario desea obtener más información sobre los detalles del error y cómo corregirlo, puede visitar la página proporcionada desde la IU del navegador para obtener más detalles. La URL debe ser del mismo sitio que el configURL del IdP.

try {
  const cred = await navigator.credentials.get({
    identity: {
      providers: [
        {
          configURL: 'https://idp.example/manifest.json',
          clientId: '1234',
        },
      ],
    }
  });
} catch (e) {
  const code = e.code;
  const url = e.url;
}

API de marcas de selección automática

mediation: optional es el comportamiento de mediación del usuario predeterminado en la API de Credential Management y activa la reautenticación automática cuando es posible. Sin embargo, es posible que la reautenticación automática no esté disponible debido a motivos que solo el navegador sabe. Cuando no está disponible, se le puede solicitar al usuario que acceda con una mediación explícita del usuario, que es un flujo con diferentes propiedades.

  • Desde la perspectiva de un llamador de la API, cuando recibe un token de ID, no puede visualizar si se trata del resultado de un flujo de reautenticación automática. Esto hace que sea difícil evaluar el rendimiento de la API y mejorar la UX según corresponda.
  • Desde la perspectiva del IdP, tampoco pueden saber si se produjo una reautenticación automática para la evaluación del rendimiento. Además, el hecho de que se haya involucrado una mediación explícita de usuarios podría ayudarlos a admitir más funciones relacionadas con la seguridad. Por ejemplo, es posible que algunos usuarios prefieran un nivel de seguridad más alto que requiera una mediación explícita del usuario en la autenticación. Si un IdP recibe una solicitud de token sin esa mediación, podría manejar la solicitud de manera diferente. Por ejemplo, muestra un código de error de modo que el RP pueda volver a llamar a la API de FedCM con mediation: required.

Por lo tanto, proporcionar visibilidad del flujo de reautenticación automática sería beneficioso para los desarrolladores.

Con la API de marcas seleccionadas automáticamente, Chrome comparte si se obtuvo un permiso de usuario explícito cuando se presiona el botón Continuar como con el IdP y el RP, siempre que se produzca una reautenticación automática o se produzca una mediación explícita. El uso compartido solo ocurre después de que se otorga el permiso del usuario para la comunicación de IdP/RP.

Uso compartido de IdP

Para compartir la información con el permiso de publicación del usuario de IdP, Chrome incluye is_auto_selected=true en la solicitud POST enviada a id_assertion_endpoint:

POST /fedcm_assertion_endpoint HTTP/1.1
Host: idp.example
Origin: https://rp.example/
Content-Type: application/x-www-form-urlencoded
Cookie: 0x23223
Sec-Fetch-Dest: webidentity

account_id=123&client_id=client1234&nonce=Ct0D&disclosure_text_shown=true&is_auto_selected=true

Uso compartido de partes restringidas

El navegador puede compartir la información con el RP en isAutoSelected a través de IdentityCredential:

const cred = await navigator.credentials.get({
  identity: {
    providers: [{
      configURL: 'https://idp.example/manifest.json',
      clientId: '1234'
    }]
  }
});

if (cred.isAutoSelected !== undefined) {
  const isAutoSelected = cred.isAutoSelected;
}

Interactúa y comparte comentarios

Si tienes comentarios o experimentas algún problema durante la prueba, puedes compartirlos en crbug.com.

Foto de Girl with red hat de Unsplash