BitWarden Passwordless.dev es un kit de herramientas de software que ayuda a los desarrolladores a construir características de KeBauthn PassKeys de FIDO2 para flujos de autenticación perfectos.
Usar sin contraseña.dev significa que no hay necesidad de leer una extensa documentación de especificación W3C, determinar qué criptografía implementar o preocuparse por administrar las claves públicas almacenadas. El equipo detrás de Bitwarden se encargará de eso por usted.
El proyecto passwordless-server contiene las API, la base de datos y otros elementos de infraestructura básicos necesarios para el backend de todos los clientes sin contraseña.
Puede probar una aplicación web de demostración, alimentada por contraseña sin contraseña.dev en demo.passwordless.dev. También puedes ver el video a continuación:
Para comenzar a usar sin contraseña.dev:
Puede usar sin contraseña junto con una variedad de diferentes plataformas de backend; consulte la documentación para obtener más información. A continuación se muestra un ejemplo de una integración de backend utilizando el núcleo ASP.NET y el SDK sin contraseña para .NET:
// Add Passwordless to your service container
services . AddPasswordlessSdk ( options =>
{
options . ApiSecret = "your_api_secret" ;
} ) ;
// ...
// Define the /register endpoint
app . MapGet ( "/register" , async ( IPasswordlessClient passwordless , string alias ) =>
{
// Get existing user ID from session or create a new user in your database
var userId = Guid . NewGuid ( ) . ToString ( ) ;
// Provide the userid and an alias to link to this user
var payload = new RegisterOptions ( userId , alias )
{
// Optional: Link this user ID to an alias (e.g. email)
Aliases = [ alias ]
} ;
try
{
var tokenRegistration = await passwordless . CreateRegisterTokenAsync ( payload ) ;
// Return this token to the frontend
return Ok ( tokenRegistration ) ;
}
catch ( PasswordlessApiException e )
{
return new JsonResult ( e . Details )
{
StatusCode = ( int ? ) e . StatusCode ,
} ;
}
} ) ;
// Define the /signin endpoint
app . MapGet ( "/signin" , async ( IPasswordlessClient passwordless , string token ) =>
{
try
{
var verifiedUser = await passwordless . VerifyTokenAsync ( token ) ;
// Sign the user in, set a cookie, etc
return Ok ( verifiedUser ) ;
}
catch ( PasswordlessApiException e )
{
return new JsonResult ( e . Details )
{
StatusCode = ( int ? ) e . StatusCode
} ;
}
} ) ;Termine la configuración de su registro y firme los flujos utilizando el cliente sin contraseña en su frontend. También proporcionamos integraciones de primera parte para varios marcos de frontends; consulte la documentación para obtener más información. A continuación se muestra un ejemplo simple usando Vanilla JavaScript:
Instalar :
$ npm install @passwordlessdev/passwordless-clientPunto final de registro :
import Passwordless from '@passwordlessdev/passwordless-client' ;
// Instantiate a passwordless client using your API public key.
const p = new Passwordless . Client ( {
apiKey : "myapplication:public:4364b1a49a404b38b843fe3697b803c8"
} ) ;
// Fetch the registration token from the backend.
const backendUrl = "https://localhost:8002" ;
const registerToken = await fetch ( backendUrl + "/register?userId" + userId ) . then ( r => r . json ( ) ) ;
// Register the token with the end-user's device.
const { token , error } = await p . register ( registerToken ) ;Significar el punto final :
import Passwordless from '@passwordlessdev/passwordless-client' ;
// Instantiate a passwordless client using your API public key.
const p = new Passwordless . Client ( {
apiKey : 'myapplication:public:4364b1a49a404b38b843fe3697b803c8'
} ) ;
// Generate an authentication token for the user.
// Option 1: Enable browsers to suggest passkeys for any input that has autofill="webauthn" (only works with discoverable passkeys).
const { token , error } = await p . signinWithAutofill ( ) ;
// Option 2: Enables browsers to suggest passkeys by opening a UI prompt (only works with discoverable passkeys).
const { token , error } = await p . signinWithDiscoverable ( ) ;
// Option 3: Use an alias specified by the user.
const email = '[email protected]' ;
const { token , error } = await p . signinWithAlias ( email ) ;
// Option 4: Use a userId if already known, for example if the user is re-authenticating.
const userId = '107fb578-9559-4540-a0e2-f82ad78852f7' ;
const { token , error } = await p . signinWithId ( userId ) ;
if ( error ) {
console . error ( error ) ;
// { errorCode: "unknown_credential", "title": "That credential is not registered with this website", "details": "..."}
}
// Call your backend to verify the token.
const backendUrl = 'https://localhost:8002' ; // Your backend
const verifiedUser = await fetch ( backendUrl + '/signin?token=' + token ) . then ( ( r ) => r . json ( ) ) ;
if ( verifiedUser . success === true ) {
// If successful, proceed!
// verifiedUser.userId = "107fb578-9559-4540-a0e2-f82ad78852f7";
} ¡Damos la bienvenida a las contribuciones del código! Por favor, comprometa cualquier solicitud de extracción contra la rama main . Todos los cambios requieren pruebas que prueben el comportamiento previsto. Tenga en cuenta que los grandes cambios en el código y las unidades de trabajo tienen menos probabilidades de fusionarse debido a la carga de revisión.
Las auditorías de seguridad y los comentarios son bienvenidos. Abra un problema o envíenos un correo electrónico en privado si el informe es de naturaleza sensible. Puede leer nuestra política de seguridad en el archivo Security.md. También ejecutamos un programa en Hackerone.
No se otorga ninguna subvención de ningún derecho en las marcas comerciales, marcas de servicio o logotipos de BitWarden (excepto que sea necesario para cumplir con los requisitos de notificación según corresponda), y el uso de cualquier marca registrada de BitWarden debe cumplir con las pautas de marcas de BitWard.
Ver contribuyente.md
Consulte el directorio de autohostación para obtener instrucciones sobre cómo autohospedar sin contraseña. Dev.
Si necesita soporte del equipo sin contraseña.dev, envíenos un mensaje a [email protected].