Bitwarden Passwordless.dev est une boîte à outils logicielle qui aide les développeurs à créer des fonctionnalités FIDO2 WebAuthn PassKeys pour les flux d'authentification transparents.
Utilisation de Passwordless.dev signifie qu'il n'est pas nécessaire de lire une documentation de spécification W3C approfondie, de déterminer la cryptographie à implémenter ou de s'inquiéter de gérer les clés publiques stockées. L'équipe derrière Bitwarden s'en occupera pour vous.
Le projet passwordless-server contient les API, la base de données et d'autres éléments d'infrastructure de base nécessaires pour le backend de tous les clients sans mot de passe.
Vous pouvez essayer une application Web de démonstration, alimentée par Passwordless.dev sur Demo.passwordless.dev. Vous pouvez également regarder la vidéo ci-dessous:
Pour commencer à utiliser Passwordless.dev:
Vous pouvez utiliser sans mot de passe conjointement avec une variété de plates-formes backend différentes - voir la documentation pour plus d'informations. Vous trouverez ci-dessous un exemple d'intégration backend utilisant ASP.NET Core et le SDK sans mot de passe pour .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
} ;
}
} ) ;Terminez la configuration de votre inscription et des flux de signature en utilisant le client sans mot de passe sur votre frontend. Nous fournissons également des intégrations de premier parti pour plusieurs frameworks de frontend - consultez la documentation pour plus d'informations. Vous trouverez ci-dessous un exemple simple utilisant la vanille javascript:
Installer :
$ npm install @passwordlessdev/passwordless-clientPoint de terminaison d'inscription :
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 ) ;Point de terminaison signer :
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";
} Nous accueillons les contributions du code! Veuillez commettre des demandes de traction contre la branche main . Tous les modifications nécessitent des tests qui prouvent le comportement prévu. Veuillez noter que les changements de code importants et les unités de travail sont moins susceptibles d'être fusionnés en raison de la charge d'examen.
Les audits de sécurité et les commentaires sont les bienvenus. Veuillez ouvrir un problème ou nous envoyer un e-mail en privé si le rapport est de nature sensible. Vous pouvez lire notre politique de sécurité dans le fichier Security.md. Nous organisons également un programme sur Hackerone.
Aucune concession de droits sur les marques, les marques de service ou les logos de Bitwarden n'est faite (sauf si cela peut être nécessaire pour se conformer aux exigences d'avis applicables), et l'utilisation de toutes les marques de bitwarden doit se conformer aux directives de marque Bitwarden.
Voir contribution.md
Voir le répertoire d'auto-hébergement pour des instructions sur la façon d'auto-héberger un mot de passe.dev.
Si vous avez besoin d'une prise en charge de l'équipe sans mot de passe.dev, envoyez-nous un message à [email protected].