

¡Los Passkeys son increíbles! Solo un par de claves públicos/privados que puede usar para autenticarse con un sitio web (o una aplicación asociada).
Son mucho más convenientes que las contraseñas porque no tiene que recordar nada o elegir algo que satisfaga reglas cada vez más complejas. También están más seguros porque están vinculados al sitio con el que está autenticando, potencialmente eliminando el phishing, y solo se almacena una clave pública en el servidor, por lo que no hay nada que valga la pena robar (la clave pública es, lo adivinó, público).
La clave privada es mantenida por usted. O más bien, su administrador de contraseñas, por lo que se puede compartir entre dispositivos. Apple, Google, Microsoft y Amazon están alentando activamente la absorción. Si almacena una tecla PassKey en un administrador de contraseñas (como Dashlane, 1Password o Apple Keychain), también puede compartirla con amigos.
Registrarse e iniciar sesión en, sitios web y aplicaciones, hasta ahora, ha sido una gran barrera, pero con Passkeys finalmente se resuelve. Implementemos en todas partes para que finalmente podamos consignar contraseñas al contenedor. Passkeys son más fáciles y más seguros: ¿qué no le gusta?
En Red Badger, mantenemos el kit de herramientas de desarrollo de aplicaciones multiplataforma de código abierto llamado Crux. Utiliza Rust y WebAssembly para que sea fácil y divertido crear aplicaciones que se ejecuten en iOS, Android y Web (y línea de comandos, y aplicaciones de terminal, y ...).
Crux nos permite construir la funcionalidad de nuestra aplicación una vez, y probarla en milisegundos, lo que nos permite garantizar que nuestra aplicación funcione correctamente y exactamente de la misma manera en todas las plataformas.
Este repositorio se trata de llevar PassKeys a las aplicaciones de Crux.
No es enormemente complicado hacer esto, pero hay algunos pasos tanto para el registro como para el inicio de sesión que necesita para hacer lo correcto. Es un poco difícil agregarlo a las aplicaciones web existentes (y aplicaciones de iOS y aplicaciones de Android) y asegurarse de que la implementación sea correcta en las tres. Crux ayuda aquí. Podemos construirlo y probarlo una vez.
El directorio shared en este repositorio contiene una capacidad de Keyk Key, que, junto con la capacidad de crux_http , está orquestada por una aplicación de autenticación de Crux, con pruebas, que se puede usar como una "sub-aplicación", anidada dentro de otra aplicación de Crux.
Mi plan fue excelente, reuniendo una tecnología realmente genial como Keeys, Rust, WebAssembly y Crux, pero quería más.
Entonces agregué el giro de Fermyon a la ecuación. ¡Spin es genial! No tiene servidor sin el inicio en frío. Servicios ultra livianos que se inician en respuesta a una solicitud entrante (en microsegundos) y mueren después de que se haya procesado la solicitud.
Para admitir PassKeys, necesitamos un backend que exponga el protocolo WebAuthn. Está escrito en Rust y compilado a WebAssembly ( wasm32-wasi ). Tuve que saltar a través de unos pocos aros, como para proveer una versión compatible con WASM de OpenSSL, estamos en el borde sangrado aquí, ¡pero funciona!
El servidor también aloja una aplicación web Leptos escrita en Rust.
Se puede implementar, como es, a Fermyon Cloud.
Cambiar al directorio crux-passkey-server :
cd crux-passkey-server Cree un archivo .env con el siguiente contenido:
export SPIN_VARIABLE_DOMAIN_LOCAL=localhost
export SPIN_VARIABLE_DOMAIN_REMOTE=crux-passkey-server-8sdh7f6w.fermyon.app # Change this to your own domain Cree un certificado SSL (preferiblemente emitido por una CA de confianza) y la clave y colóquelos en el directorio certs . Los nombres de archivo deben ser cert.pem y key.pem . Puede seguir las instrucciones aquí (es posible que deba agregar la CA a la tienda de confianza de su navegador, o confiar en ellas en llavero en macOS-Spin 2.0 bloquea en el uso de certificaciones autofirmadas)
Inicie el servidor de giro local:
./run.shY luego abra su navegador en https: // localhost
O publicar en Fermyon Cloud (necesitará tener una cuenta de Fermyon y haber instalado la CLI Fermyon):
./cloud_create_db.sh # Only need to do this once
./deploy.shY luego abra su navegador en https://crux-passkey-server-8sdh7f6w.fermyon.app (o lo que sea su dominio)

El diagrama anterior muestra el proceso de registro.
El usuario ingresa su dirección de correo electrónico y hace clic en "Registrarse" (Web), o "Registrarse" (aplicación iOS).
La aplicación auth , a través del evento GetCreationChallenge y la capacidad de crux_http , envía una solicitud POST al backend.
El backend responde con un objeto PublicKeyCredentialCreationOptions , a través del evento CreationChallenge .
Para la aplicación iOS, esto se pasa, a través de la capacidad passkey , al lado de iOS-shell de la implementación de la capacidad de passkey , que utiliza un ASAuthorizationController para pedirle al usuario que cree una Key PassKey.
Para el shell web, esto se pasa, a través de la capacidad passkey , a la navegación del navigator.credentials.create Método por el lado de la cáscara web de la implementación de la capacidad de passkey , que le pide al usuario que cree una tecla PassKey.
El usuario crea un PassKey y la capacidad passkey devuelve un objeto RegisterPublicKeyCredential , a través del evento RegisterCredential , que contiene la clave pública, el desafío firmado y otra información.
El evento RequestCredential es manejado por la aplicación, enviando una solicitud POST , a través de la capacidad de crux_http , al backend con el objeto RegisterPublicKeyCredential .
El backend verifica la información y registra al usuario almacenando la clave pública del usuario en su base de datos, respondiendo con un código de estado 201 Created .
El evento CredentialRegistered es manejado por la aplicación, que actualiza su estado para indicar que el usuario está registrado.

El usuario ingresa su dirección de correo electrónico y hace clic en "Iniciar sesión" (Web), o "Iniciar sesión" (aplicación iOS).
La aplicación auth , a través del evento GetRequestChallenge y la capacidad de crux_http , envía una solicitud POST al backend.
El backend responde con un objeto PublicKeyCredentialRequestOptions , a través del evento RequestChallenge .
Para la aplicación iOS, esto se pasa, a través de la capacidad passkey , al lado de iOS-Shell de la implementación de la capacidad de passkey , que utiliza un ASAuthorizationController para pedirle al usuario que inicie sesión con su Key PassKey.
Para el shell web, esto se pasa, a través de la capacidad passkey passkey , a la navigator.credentials.get del navegador.
El usuario ingresa a su PassKey y la capacidad passkey devuelve un objeto PublicKeyCredential , a través del evento Credential , que contiene el desafío firmado y otra información.
El evento RequestCredential es manejado por la aplicación, enviando una solicitud POST , a través de la capacidad de crux_http , al backend con el objeto PublicKeyCredential .
El backend verifica la información y responde con un código de estado 200 OK .
El evento CredentialVerified es manejado por la aplicación, que actualiza su estado para indicar que el usuario ha iniciado sesión.
El directorio shared contiene el núcleo de la implementación. Es un ejemplo de una aplicación Root Crux que nesta una aplicación de auth . La aplicación auth orquesta las capacidades de crux_http y passkey para proporcionar la funcionalidad de registro e inicio de sesión de PassKey contra el backend.