Bitwarden Passwordless.devは、開発者がシームレスな認証フローのためにFIDO2 WebAuthn PassKeys機能を構築するのに役立つソフトウェアツールキットです。
PasswordLess.devを使用すると、広範なW3C仕様ドキュメントを読み取る必要がないこと、実装する暗号化を決定する、または保存された公開キーの管理を心配する必要がないことを意味します。 Bitwardenの背後にあるチームがあなたのためにそれを世話します。
passwordless-serverプロジェクトには、すべてのパスワードレスクライアントのバックエンドに必要なAPI、データベース、およびその他のコアインフラストラクチャアイテムが含まれています。
demo.passwordless.devでpasswordless.devを搭載したデモWebアプリを試すことができます。以下のビデオを見ることもできます。
passwordless.devを使用して始めるには:
さまざまなバックエンドプラットフォームと組み合わせてパスワードレスを使用できます。詳細については、ドキュメントを参照してください。以下は、ASP.NETコアと.NETのパスワードレスSDKを使用したバックエンド統合の例です。
// 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
} ;
}
} ) ;フロントエンドでパスワードレスクライアントを使用して、登録とサインインフローのセットアップを完了します。また、いくつかのフロントエンドフレームワークのファーストパーティ統合も提供しています。詳細については、ドキュメントを参照してください。以下は、Vanilla JavaScriptを使用した簡単な例です。
インストール:
$ npm install @passwordlessdev/passwordless-client登録エンドポイント:
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 ) ;Signin Endpoint :
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";
} コードの貢献を歓迎します! mainブランチに対してプルリクエストをコミットしてください。すべての変更には、意図した動作を証明するテストが必要です。レビューの負担のために、大規模なコードの変更と作業単位が融合される可能性が低いことに注意してください。
セキュリティ監査とフィードバックは大歓迎です。レポートが本質的に敏感な場合は、問題を開いたり、個人的に電子メールを送ったりしてください。 Security.mdファイルでセキュリティポリシーを読むことができます。 Hackeroneでプログラムも実行しています。
Bitwardenの商標、サービスマーク、またはロゴの権利の付与は行われません(該当する場合は通知要件を遵守するために必要な場合を除く)、Bitwarden商標の使用はBitwarden商標ガイドラインに準拠する必要があります。
Convributing.mdを参照してください
Passwordless.dev.devを自己ホストする方法については、自己ホスティングディレクトリを参照してください。
PasswordLess.devチームからサポートが必要な場合は、[email protected]にメッセージを送信してください。