bitwarden password.dev هي مجموعة أدوات البرمجيات التي تساعد المطورين على بناء ميزات FIDO2 Webauthn passkeys لتدفقات المصادقة السلس.
باستخدام Passworlless.dev يعني أنه لا توجد حاجة لقراءة وثائق مواصفات W3C واسعة النطاق ، أو تحديد التشفير لتنفيذها ، أو القلق بشأن إدارة المفاتيح العامة المخزنة. سيعتني الفريق خلف Bitwarden بذلك من أجلك.
يحتوي مشروع passwordless-server على واجهات برمجة التطبيقات ، وقاعدة البيانات ، وغيرها من عناصر البنية التحتية الأساسية اللازمة للواجهة الخلفية لجميع عملاء كلمة المرور.
يمكنك تجربة تطبيق ويب تجريبي ، مدعوم من كلمة المرور. يمكنك أيضًا مشاهدة الفيديو أدناه:
للبدء في استخدام كلمة المرور. dev:
يمكنك استخدام Passwordly بالتزامن مع مجموعة متنوعة من منصات الخلفية المختلفة - راجع الوثائق لمزيد من المعلومات. فيما يلي مثال على تكامل الواجهة الخلفية باستخدام ASP.NET Core و SDK بدون كلمة المرور لـ .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
} ;
}
} ) ;الانتهاء من إعداد التسجيل وتدفقات التسجيل باستخدام عميل كلمة المرور على الواجهة الأمامية. نقدم أيضًا تكامل الطرف الأول للعديد من أطر العمل الأمامي أيضًا-راجع الوثائق لمزيد من المعلومات. فيما يلي مثال بسيط باستخدام الفانيليا جافا سكريبت:
ثَبَّتَ :
$ 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 :
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.
انظر المساهمة
راجع دليل الاستضافة الذاتي للحصول على تعليمات حول كيفية استضافة كلمة مرور.
إذا كنت بحاجة إلى دعم من فريق Passworlless.dev ، فأرسل لنا رسالة على [email protected].