tag manager google extensiones extension español chrome google-chrome authentication fido-u2f

google-chrome - manager - tag analysis



¿Cómo uso FIDO U2F para permitir que los usuarios se autentiquen en mi sitio web? (2)

Lo que intenta hacer es implementar una llamada "parte dependiente", lo que significa que su servicio web dependerá de la afirmación de identidad proporcionada por el token FIDO U2F.

Deberá comprender las especificaciones U2F para hacer eso. Especialmente cómo se implementará el paradigma de desafío-respuesta y cómo funcionan las identidades y facetas de la aplicación. Esto se describe en la especificación en detalle.

Tiene razón: el código real necesario para trabajar con FIDO U2F desde el frente de su aplicación es casi trivial (es decir, si usa la API de JavaScript de "alto nivel" en lugar de la API de MessagePort de "bajo nivel") . Sin embargo, su aplicación deberá funcionar con los mensajes generados por el token y validarlos. Esto no es trivial.

Para ilustrar cómo podría continuar implementando un sitio de terceros, daré algunos ejemplos de código, tomados de una extensión de Token de FIDO U2F virtual que he programado últimamente por razones académicas. Puede ver la página para obtener el código de ejemplo completo.

Antes de que los usuarios puedan usar sus tokens FIDO U2F para autenticarse, deben registrarlo con usted. Para permitir que lo hagan, debe llamar a window.u2f.register en su navegador. Para hacer eso, debe proporcionar algunos parámetros (de nuevo, lea la especificación para más detalles). Entre ellos, un desafío y la identificación de su aplicación. Para una aplicación web, esta identificación debe ser el origen web de la página web que desencadena la operación FIDO. Supongamos que es example.org :

window.u2f.register([ { version : "U2F_V2", challenge : "YXJlIHlvdSBib3JlZD8gOy0p", appId : "http://example.org", sessionId : "26" } ], [], function (data) { });

Una vez que el usuario realiza una "prueba de presencia del usuario" (por ejemplo, tocando el token), recibirá una respuesta, que es un objeto JSON (ver especificaciones para más detalles)

dictionary RegisterResponse { DOMString registrationData; DOMString clientData; };

Esta información contiene varios elementos con los que su aplicación necesita trabajar.

  1. La clave pública del par de claves generado: debe almacenar esto para usarla en el futuro.
  2. El controlador de clave del par de claves generado: también debe almacenarlo para usarlo en el futuro.
  3. El certificado: debe verificar si confía en este certificado y en la CA.
  4. La firma: debe verificar si la firma es válida (es decir, confirma la clave almacenada con el certificado) y si los datos firmados son los datos esperados.

He preparado un borrador de implementación aproximado para el servidor de terceros dependiente en Java que muestra cómo extraer y validar esta información últimamente.

Una vez que se completa el registro y de alguna manera ha almacenado los detalles de la clave generada, puede firmar las solicitudes.

Como dijiste, esto se puede iniciar brevemente y de forma sencilla a través de la API JavaScript de alto nivel:

window.u2f.sign([{ version : "U2F_V2", challenge : "c3RpbGwgYm9yZWQ/IQ", app_id : "http://example.org", sessionId : "42", keyHandle: "ZHVtbXlfa2V5X2hhbmRsZQ" }], function (data) { });

Aquí, debe proporcionar el identificador de clave que obtuvo durante el registro . Una vez más, después de que el usuario realiza una "prueba de presencia del usuario" (por ejemplo, tocando el token), recibirá una respuesta, que es un objeto JSON (de nuevo, consulte las especificaciones para obtener más detalles)

dictionary SignResponse { DOMString keyHandle; DOMString signatureData; DOMString clientData; };

Usted tiene la necesidad de validar los datos de firma contenidos en este documento.

  1. Debe asegurarse de que la firma coincida con la clave pública que obtuvo anteriormente.
  2. También debe validar que la cadena firmada es apropiada.

Una vez que haya realizado estas validaciones, puede considerar al usuario autenticado. Una breve implementación de ejemplo del código del lado del servidor para eso también está contenida en mi ejemplo de servidor .

Con todos los rumores recientes en torno a la especificación FIDO U2F, me gustaría implementar FIDO U2F en pruebas en un banco de pruebas para estar listo para el próximo lanzamiento de la especificación final.

Hasta ahora, tengo una clave de seguridad FIDO U2F producida por Yubico y la extensión FIDO U2F (Universal 2nd Factor) instalada en Chrome. También he logrado configurar la clave de seguridad para trabajar con mi inicio de sesión de Google.

Ahora, no estoy seguro de cómo hacer uso de estas cosas para mi propio sitio. He revisado la página de Google Github para el proyecto U2F y he consultado su aplicación web . Parece realmente simple (solo JavaScript). Entonces, ¿implementar la autorización de segundo factor con FIDO es tan simple como implementar algunas llamadas de JavaScript? Todo lo que parece estar sucediendo para el registro en el ejemplo es este:

var registerRequest = { appId: enrollData.appId, challenge: enrollData.challenge, version: enrollData.version }; u2f.register([registerRequest], [], function (result) { if (result.errorCode) { document.getElementById(''status'') .innerHTML = "Failed. Error code: " + result.errorCode; return; } document.location = "/enrollFinish" + "?browserData=" + result.clientData + "&enrollData=" + result.registrationData + "&challenge=" + enrollData.challenge + "&sessionId=" + enrollData.sessionId; });

Pero, ¿cómo puedo usar eso para una implementación yo mismo? ¿Podré usar la devolución de llamada de esta llamada de método para el registro de usuario?


Recientemente he escrito instrucciones para esto, así como una lista de todas las bibliotecas de servidor U2F (la mayoría de ellas agrupa un servidor de demostración que funciona completamente), en developers.yubico.com/U2F . El objetivo es permitir a los desarrolladores implementar / integrar U2F sin tener que leer las especificaciones.

Descargo de responsabilidad: trabajo como desarrollador en Yubico.