Bitwarden Passwordless.dev는 개발자가 원활한 인증 흐름을위한 FIDO2 WebAuthn Passkeys 기능을 구축 할 수 있도록 도와주는 소프트웨어 툴킷입니다.
passwordless.dev를 사용한다는 것은 광범위한 W3C 사양 문서를 읽거나 구현할 암호화를 결정하거나 저장된 공개 키 관리에 대한 걱정이 필요하지 않다는 것을 의미합니다. Bitwarden의 팀이 당신을 위해 그것을 돌볼 것입니다.
passwordless-server 프로젝트에는 API, 데이터베이스 및 모든 암호없는 클라이언트의 백엔드에 필요한 기타 핵심 인프라 항목이 포함되어 있습니다.
demo.passwordless.dev에서 passwordless.dev로 구동되는 데모 웹 앱을 시도 할 수 있습니다. 아래 비디오를 볼 수도 있습니다.
passwordless.dev 사용을 시작하려면 :
다양한 백엔드 플랫폼과 함께 비밀번호를 사용할 수 있습니다. 자세한 내용은 문서를 참조하십시오. 아래는 ASP.NET Core를 사용한 백엔드 통합의 예와 .NET 용 Passwordless 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
} ;
}
} ) ;프론트 엔드에서 비밀번호없는 클라이언트를 사용하여 등록 및 서명 흐름 설정을 마치십시오. 또한 여러 Frontend 프레임 워크에 대한 1 자 통합도 제공합니다. 자세한 내용은 문서를 참조하십시오. 아래는 바닐라 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 ) ;서명 엔드 포인트 :
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 상표 지침을 준수해야합니다.
Contributing.md를 참조하십시오
Self-Host Directory를 참조하십시오.
passwordless.dev 팀의 지원이 필요한 경우 [email protected]로 메시지를 보내주십시오.