spinny:~/writing $ less passkeys-webauthn-passwordless-authentication.md
12كلمات المرور هي واحدة من تلك الأشياء التي قمنا بتطبيعها لمجرد أننا عشنا معها لسنوات. ينساها المستخدمون، ويعيدون استخدامها، ويكتبونها في مكان لا ينبغي لهم ذلك. يجب على الفرق إدارة عمليات إعادة التعيين والسياسات والتجزئة والتسريبات والتصيد الاحتيالي والدعم.34لا تجعل passkey المصادقة مثالية، ولكنها تزيل مشكلة كبيرة: لم يعد الخادم مضطرًا إلى الاحتفاظ بسر مشترك مع المستخدم.56## ماذا يحدث حقا78أ passkey هي بيانات اعتماد تعتمد على WebAuthn. عندما يقوم المستخدم بإنشائه، يقوم الجهاز بإنشاء زوج مفاتيح:910- المفتاح الخاص الذي يبقى على الجهاز أو في مدير كلمات المرور؛11- مفتاح عام يمكن للخادم حفظه.1213عند تسجيل الدخول لا يطلب الخادم "أخبرني بكلمة المرور". إرسال تحدي عشوائي. يقوم الجهاز بتوقيعه بالمفتاح الخاص. يتحقق الخادم من التوقيع باستخدام المفتاح العام.1415هذا هو الجزء الجميل: إذا تمت سرقة قاعدة البيانات، فلن تكون هناك كلمات مرور بداخلها يمكن اختراقها. وإذا انتهى الأمر بالمستخدم إلى نطاق مزيف، فإن passkey غير صالح لهذا النطاق. إنها ليست مجرد راحة، بل إنها حماية ملموسة ضد التصيد الاحتيالي.1617## يعمل المتصفح كجسر1819في المتصفح الرئيسيين API هما:2021- `navigator.credentials.create()` لإنشاء passkey؛22- `navigator.credentials.get()` لاستخدامه أثناء تسجيل الدخول.2324لكن المنطق المهم موجود على الخادم. يجب على الخادم إنشاء التحدي وحفظه مؤقتًا والتحقق من الاستجابة والتحقق من المصدر وRelying Party ID ثم إنشاء الجلسة.2526يجب أن يكون جزء العميل مملًا تقريبًا:2728```typescript29const options = await fetch('/api/passkeys/login/options').then((r) => r.json());3031const credential = await navigator.credentials.get({32 publicKey: PublicKeyCredential.parseRequestOptionsFromJSON(options),33});3435await fetch('/api/passkeys/login/verify', {36 method: 'POST',37 headers: { 'Content-Type': 'application/json' },38 body: JSON.stringify(credential?.toJSON()),39});40```4142إذا وجدت نفسك تنفذ تشفير WebAuthn يدويًا، توقف. استخدم مكتبة قوية من جانب الخادم. الأخطاء هنا ليست "أخطاء لطيفة"، بل هي ثغرات في المصادقة.4344## ما يجب حفظه في قاعدة البيانات4546ليست هناك حاجة لإنقاذ نصف العالم. عادة ما يكفي:4748- معرف أوراق الاعتماد.49- المفتاح العام؛50- مستخدم متصل؛51- أي عداد تحقق أو بيانات وصفية؛52- وسائل النقل، إذا كانت مفيدة لتجربة المستخدم؛53- الاسم الذي اختاره المستخدم؛54- تاريخ الإنشاء وآخر استخدام.5556قد يبدو الجدول البسيط كما يلي:5758```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```6970ثم أود إضافة سجلات التدقيق والإشعارات: إذا قام شخص ما بإنشاء passkey جديد على حسابي، فأنا أريد أن أعرف ذلك.7172## تجربة المستخدم أكثر أهمية من العرض التجريبي7374العرض التوضيحي لـ passkey جميل دائمًا: انقر فوق Face ID، أنت في المنتج الفعلي أكثر تعقيدًا.7576شخص ما يغير هاتفه. يستخدم شخص ما كمبيوتر شركة مقفلة. بعض الأشخاص لا يفهمون سبب اقتراح المتصفح لـ passkey. شخص ما يفقد الوصول إلى أجهزته.7778ولهذا السبب لن أبدأ بـ "من اليوم لن يكون هناك المزيد من كلمات المرور للجميع". سأبدأ هكذا:79801. passkey اختياري للمستخدمين الداخليين؛812. اقتراح لإنشاء واحدة بعد تسجيل الدخول الناجح؛823. صفحة الحساب لإعادة تسمية وإزالة passkey؛834. تراجع واضح.845. الطرح التدريجي في تسجيل الدخول الرئيسي.8586يجب أن يكون النص الموجود في الواجهة بسيطًا. يعد "استخدام شاشة قفل جهازك" أفضل من "المصادقة باستخدام بيانات اعتماد FIDO2 المقيمة".8788## أخطاء يجب أن أتجنبها8990لا تولد تحديات على العميل. يتم إنشاء التحدي على الخادم ويجب التحقق منه مرة واحدة فقط.9192لا تثق فقط بمعرف بيانات الاعتماد. تحتاج إلى التحقق من التوقيع والتحدي والأصل وRelying Party ID.9394لا تقم بحذف الإجراءات الاحتياطية قبل أن يكون لديك تدفق جيد للاسترداد. ليس من الضروري أن تصبح كلمة المرور بدون كلمة مرور "إذا فقدت هاتفك فستخرج إلى الأبد".9596لا تتعامل مع passkey كزر أمامي بحت. إخفاء زر ليس أمرًا أمنيًا: فالتحقق الحقيقي يتم من جانب الخادم.9798## Passkey-الأول أم passkey-صديق؟99100للحصول على منتج جديد يمكنك التفكير passkey-أولاً. بالنسبة إلى تطبيق حالي، أفضّل أن يكون صديقًا لـ passkey: أضف passkey كطريقة موصى بها، وقم بقياس النجاح والمشاكل، ثم قم بتقليل وزن كلمة المرور بهدوء.101102الهجرة المثالية ليست محسوسة. يكتشف المستخدم أن تسجيل الدخول أسهل، وليس أن الشركة قد غيرت بروتوكول المصادقة الخاص بها.103104## الخلاصة105106تعتبر passkey مثيرة للاهتمام لأنها تعمل على تحسين الأمان وتجربة المستخدم في نفس الوقت، وهو أمر نادر. إنها ليست عصا سحرية: لا يزال يتعين تصميم عملية الاسترداد والتوافق والدعم والطرح بشكل جيد.107108لكن التغيير الأساسي قوي. توقف عن مطالبة المستخدمين بابتكار الأسرار وحمايتها. أنت تسمح للجهاز بالتوقيع على دليل تشفير مرتبط بنطاقك. ذاكرة بشرية أقل، وتصيد أقل، وعمليات إعادة تعيين كلمة مرور أقل. أود أن أقول إنهم يستحقون أن يؤخذوا على محمل الجد.109110## المصادر111112- [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
:Passkey و WebAuthn: تسجيل الدخول بدون كلمة مرور، بدون سحرlines 1-116 (END) — press q to close