spinny:~/writing $ vim passkeys-webauthn-passwordless-authentication.md
1~2كلمات المرور هي واحدة من تلك الأشياء التي قمنا بتطبيعها لمجرد أننا عشنا معها لسنوات. ينساها المستخدمون، ويعيدون استخدامها، ويكتبونها في مكان لا ينبغي لهم ذلك. يجب على الفرق إدارة عمليات إعادة التعيين والسياسات والتجزئة والتسريبات والتصيد الاحتيالي والدعم.3~4لا تجعل passkey المصادقة مثالية، ولكنها تزيل مشكلة كبيرة: لم يعد الخادم مضطرًا إلى الاحتفاظ بسر مشترك مع المستخدم.5~6## ماذا يحدث حقا7~8أ passkey هي بيانات اعتماد تعتمد على WebAuthn. عندما يقوم المستخدم بإنشائه، يقوم الجهاز بإنشاء زوج مفاتيح:9~10- المفتاح الخاص الذي يبقى على الجهاز أو في مدير كلمات المرور؛11- مفتاح عام يمكن للخادم حفظه.12~13عند تسجيل الدخول لا يطلب الخادم "أخبرني بكلمة المرور". إرسال تحدي عشوائي. يقوم الجهاز بتوقيعه بالمفتاح الخاص. يتحقق الخادم من التوقيع باستخدام المفتاح العام.14~15هذا هو الجزء الجميل: إذا تمت سرقة قاعدة البيانات، فلن تكون هناك كلمات مرور بداخلها يمكن اختراقها. وإذا انتهى الأمر بالمستخدم إلى نطاق مزيف، فإن passkey غير صالح لهذا النطاق. إنها ليست مجرد راحة، بل إنها حماية ملموسة ضد التصيد الاحتيالي.16~17## يعمل المتصفح كجسر18~19في المتصفح الرئيسيين API هما:20~21- `navigator.credentials.create()` لإنشاء passkey؛22- `navigator.credentials.get()` لاستخدامه أثناء تسجيل الدخول.23~24لكن المنطق المهم موجود على الخادم. يجب على الخادم إنشاء التحدي وحفظه مؤقتًا والتحقق من الاستجابة والتحقق من المصدر وRelying Party ID ثم إنشاء الجلسة.25~26يجب أن يكون جزء العميل مملًا تقريبًا:27~28```typescript29const options = await fetch('/api/passkeys/login/options').then((r) => r.json());30~31const credential = await navigator.credentials.get({32 publicKey: PublicKeyCredential.parseRequestOptionsFromJSON(options),33});34~35await fetch('/api/passkeys/login/verify', {36 method: 'POST',37 headers: { 'Content-Type': 'application/json' },38 body: JSON.stringify(credential?.toJSON()),39});40```41~42إذا وجدت نفسك تنفذ تشفير WebAuthn يدويًا، توقف. استخدم مكتبة قوية من جانب الخادم. الأخطاء هنا ليست "أخطاء لطيفة"، بل هي ثغرات في المصادقة.43~44## ما يجب حفظه في قاعدة البيانات45~46ليست هناك حاجة لإنقاذ نصف العالم. عادة ما يكفي:47~48- معرف أوراق الاعتماد.49- المفتاح العام؛50- مستخدم متصل؛51- أي عداد تحقق أو بيانات وصفية؛52- وسائل النقل، إذا كانت مفيدة لتجربة المستخدم؛53- الاسم الذي اختاره المستخدم؛54- تاريخ الإنشاء وآخر استخدام.55~56قد يبدو الجدول البسيط كما يلي:57~58```sql59create table passkey_credentials (60 id uuid primary key default gen_random_uuid(),61 user_id uuid not null references users(id),62 credential_id text not null unique,63 public_key text not null,64 name text,65 created_at timestamptz not null default now(),66 last_used_at timestamptz67);68```69~70ثم أود إضافة سجلات التدقيق والإشعارات: إذا قام شخص ما بإنشاء passkey جديد على حسابي، فأنا أريد أن أعرف ذلك.71~72## تجربة المستخدم أكثر أهمية من العرض التجريبي73~74العرض التوضيحي لـ passkey جميل دائمًا: انقر فوق Face ID، أنت في المنتج الفعلي أكثر تعقيدًا.75~76شخص ما يغير هاتفه. يستخدم شخص ما كمبيوتر شركة مقفلة. بعض الأشخاص لا يفهمون سبب اقتراح المتصفح لـ passkey. شخص ما يفقد الوصول إلى أجهزته.77~78ولهذا السبب لن أبدأ بـ "من اليوم لن يكون هناك المزيد من كلمات المرور للجميع". سأبدأ هكذا:79~801. passkey اختياري للمستخدمين الداخليين؛812. اقتراح لإنشاء واحدة بعد تسجيل الدخول الناجح؛823. صفحة الحساب لإعادة تسمية وإزالة passkey؛834. تراجع واضح.845. الطرح التدريجي في تسجيل الدخول الرئيسي.85~86يجب أن يكون النص الموجود في الواجهة بسيطًا. يعد "استخدام شاشة قفل جهازك" أفضل من "المصادقة باستخدام بيانات اعتماد FIDO2 المقيمة".87~88## أخطاء يجب أن أتجنبها89~90لا تولد تحديات على العميل. يتم إنشاء التحدي على الخادم ويجب التحقق منه مرة واحدة فقط.91~92لا تثق فقط بمعرف بيانات الاعتماد. تحتاج إلى التحقق من التوقيع والتحدي والأصل وRelying Party ID.93~94لا تقم بحذف الإجراءات الاحتياطية قبل أن يكون لديك تدفق جيد للاسترداد. ليس من الضروري أن تصبح كلمة المرور بدون كلمة مرور "إذا فقدت هاتفك فستخرج إلى الأبد".95~96لا تتعامل مع passkey كزر أمامي بحت. إخفاء زر ليس أمرًا أمنيًا: فالتحقق الحقيقي يتم من جانب الخادم.97~98## Passkey-الأول أم passkey-صديق؟99~100للحصول على منتج جديد يمكنك التفكير passkey-أولاً. بالنسبة إلى تطبيق حالي، أفضّل أن يكون صديقًا لـ passkey: أضف passkey كطريقة موصى بها، وقم بقياس النجاح والمشاكل، ثم قم بتقليل وزن كلمة المرور بهدوء.101~102الهجرة المثالية ليست محسوسة. يكتشف المستخدم أن تسجيل الدخول أسهل، وليس أن الشركة قد غيرت بروتوكول المصادقة الخاص بها.103~104## الخلاصة105~106تعتبر passkey مثيرة للاهتمام لأنها تعمل على تحسين الأمان وتجربة المستخدم في نفس الوقت، وهو أمر نادر. إنها ليست عصا سحرية: لا يزال يتعين تصميم عملية الاسترداد والتوافق والدعم والطرح بشكل جيد.107~108لكن التغيير الأساسي قوي. توقف عن مطالبة المستخدمين بابتكار الأسرار وحمايتها. أنت تسمح للجهاز بالتوقيع على دليل تشفير مرتبط بنطاقك. ذاكرة بشرية أقل، وتصيد أقل، وعمليات إعادة تعيين كلمة مرور أقل. أود أن أقول إنهم يستحقون أن يؤخذوا على محمل الجد.109~110## المصادر111~112- [MDN: Passkeys](https://developer.mozilla.org/en-US/docs/Web/Security/Authentication/Passkeys)113- [MDN: Web Authentication API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API)114- [W3C: Web Authentication](https://www.w3.org/TR/webauthn-3/)115- [passkeys.dev](https://passkeys.dev/)116~
NORMAL · passkeys-webauthn-passwordless-authentication.md [readonly]116 lines · :q to close