

مفاهيم المارة رائعة! مجرد زوج مفتاح عام/خاص يمكنك استخدامه للمصادقة مع موقع ويب (أو تطبيق مرتبط).
إنها أكثر ملاءمة من كلمات المرور لأنك لست مضطرًا لتذكر أي شيء ، أو اختيار شيء يرضي قواعد معقدة بشكل متزايد. إنها أيضًا أكثر أمانًا لأنها مرتبطة بالموقع الذي تقوم به المصادقة عليه ، مما يحتمل أن يلغي التصيد ، ويتم تخزين مفتاح عام فقط على الخادم ، لذلك لا يوجد شيء يستحق السرقة (المفتاح العام هو ، كما تفكر ، عام).
يتم الاحتفاظ بالمفتاح الخاص بك. أو بالأحرى مدير كلمة المرور الخاص بك ، بحيث يمكن مشاركتها بين الأجهزة. تشجع Apple و Google و Microsoft و Amazon بشكل نشط على الامتصاص. إذا قمت بتخزين مفتاح المرور في مدير كلمة المرور (مثل Dashlane أو 1Password أو Apple Keychain) ، فيمكنك أيضًا مشاركته مع الأصدقاء.
كان التسجيل مع ومواقع الويب والتطبيقات ، وتسجيلها ، حتى الآن ، حاجزًا كبيرًا ، ولكن مع مفاتيح تم حلها أخيرًا. دعنا ننفذها في كل مكان حتى نتمكن أخيرًا من إرسال كلمات المرور إلى الصندوق. المفاتيح أسهل وأكثر أمانًا - ما الذي لا يعجبك؟
في Red Badger ، نحافظ على مجموعة أدوات تطوير التطبيقات متعددة المنصات مفتوحة المصدر تسمى Crux. يستخدم Rust و Webassembly لجعل من السهل والممتع إنشاء تطبيقات تعمل على iOS و Android و Web (وخط الأوامر ، وتطبيقات الطرفية ، و ...).
يتيح لنا Crux بناء وظائف تطبيقنا مرة واحدة ، واختباره بالمللي ثانية ، مما يتيح لنا التأكد من أن تطبيقنا يعمل بشكل صحيح ، ونفس الطريقة بالضبط ، على جميع المنصات.
هذا الريبو يدور حول جلب مفاتيح الممرات إلى تطبيقات الجوهر.
ليس من المعقد بشكل كبير القيام بذلك ، ولكن هناك بضع خطوات لكل من التسجيل والتسجيل الذي تحتاجه للحصول على صواب. من الصعب بعض الشيء إضافتها إلى تطبيقات الويب الحالية (وتطبيقات iOS وتطبيقات Android) وتأكد من أن التنفيذ صحيح على الثلاثة. Crux يساعد هنا. يمكننا فقط بناء واختباره مرة واحدة.
يحتوي الدليل shared في هذا الريبو ، على قدرة مفتاح Passke Crux ، والتي ، إلى جانب إمكانية crux_http ، يتم تنظيمها بواسطة تطبيق Auth Crux ، مع الاختبارات ، والتي يمكن استخدامها كـ "تطبيق فرعي"-متداخل داخل تطبيق Crux آخر.
كانت خطتي رائعة - الجمع بين التكنولوجيا الرائعة حقًا مثل مفاتيح الممرات والصدأ والعلم والكرات - لكنني أردت المزيد.
لذلك أضفت Fermyon تدور في المعادلة. الدوران رائع! إنه بدون خادم بدون بداية باردة. خدمات خفيفة الوزن فائقة والتي بدأت استجابة لطلب وارد (في microseconds) والموت بعد معالجة الطلب.
لدعم مفاتيح الممرات ، نحتاج إلى الواجهة الخلفية التي تعرض بروتوكول WebAuthn. إنه مكتوب في الصدأ وتجميعه إلى Webassembly ( wasm32-wasi ). اضطررت إلى القفز عبر بعض الأطواق ، مثل Pendoring a WASM المتوافقة مع إصدار OpenSSL-نحن على حافة النزف هنا-ولكنه يعمل!.
يستضيف الخادم أيضًا تطبيق ويب Leptos مكتوب في Rust.
يمكن نشرها ، كما هي ، في Fermyon Cloud.
التغيير إلى دليل crux-passkey-server :
cd crux-passkey-server إنشاء ملف .env مع المحتويات التالية:
export SPIN_VARIABLE_DOMAIN_LOCAL=localhost
export SPIN_VARIABLE_DOMAIN_REMOTE=crux-passkey-server-8sdh7f6w.fermyon.app # Change this to your own domain قم بإنشاء شهادة SSL (يفضل إصدارها بواسطة CA موثوق بها) ومفتاح وضعها في دليل certs . يجب أن تكون أسماء الملفات cert.pem و key.pem . يمكنك اتباع التعليمات هنا (قد تحتاج إلى إضافة CA إلى متجر Trust الخاص بالمتصفح-أو الوثوق بها في سلسلة المفاتيح على MACOS-تعطل 2.0 على استخدام شهادات موقعة ذاتيا)
ابدأ خادم الدوران المحلي:
./run.shثم افتح متصفحك على https: // localhost
أو نشر إلى Fermyon Cloud (ستحتاج إلى حساب Fermyon وقمت بتثبيت Fermyon CLI):
./cloud_create_db.sh # Only need to do this once
./deploy.shثم افتح متصفحك على https://crux-passkey-server-8sdh7f6w.fermyon.app (أو أيا كان مجالك)

يوضح الرسم البياني أعلاه عملية التسجيل.
يدخل المستخدم عنوان بريده الإلكتروني وينقر "تسجيل" (الويب) أو "التسجيل" (تطبيق iOS).
يرسل تطبيق auth ، عبر حدث GetCreationChallenge وقدرة crux_http ، طلبًا POST إلى الواجهة الخلفية.
يستجيب الواجهة الخلفية مع كائن PublicKeyCredentialCreationOptions ، عبر حدث CreationChallenge .
بالنسبة لتطبيق iOS ، يتم تمرير هذا ، من خلال قدرة passkey ، إلى الجانب iOS-shell من تطبيق قدرة مفتاح passkey ، والذي يستخدم ASAuthorizationController لمطالبة المستخدم بإنشاء مفتاح مرور.
بالنسبة لقذيفة الويب passkey يتم تمرير هذا ، من خلال قدرة passkey ، إلى المتصفح navigator.credentials.create
يقوم المستخدم بإنشاء مفتاح passkey وإرجاع قدرة RegisterPublicKeyCredential ، عبر الحدث RegisterCredential ، الذي يحتوي على المفتاح العام ، والتحدي الموقّع ، وغيرها من المعلومات.
تتم معالجة الحدث RequestCredential من قبل التطبيق ، وإرسال طلب POST ، من خلال قدرة crux_http ، إلى الواجهة الخلفية مع كائن RegisterPublicKeyCredential .
تتحقق الواجهة الخلفية من المعلومات وتسجيل المستخدم من خلال تخزين المفتاح العام للمستخدم في قاعدة البيانات الخاصة به ، والاستجابة برمز الحالة 201 Created .
تتم معالجة الحدث CredentialRegistered من قبل التطبيق من قبل التطبيق ، والذي يقوم بتحديث حالته للإشارة إلى أن المستخدم مسجل.

يقوم المستخدم بإدخال عنوان بريده الإلكتروني وينقر "تسجيل الدخول" (الويب) أو "تسجيل الدخول" (تطبيق iOS).
يرسل تطبيق auth ، عبر حدث GetRequestChallenge وقدرة crux_http ، طلبًا POST إلى الواجهة الخلفية.
يستجيب الواجهة الخلفية مع كائن PublicKeyCredentialRequestOptions ، عبر حدث RequestChallenge .
بالنسبة لتطبيق iOS ، يتم تمرير ذلك ، من خلال قدرة passkey ، إلى الجانب iOS-shell من تطبيق قدرة مفتاح passkey ، والذي يستخدم ASAuthorizationController لمطالبة المستخدم بتسجيل الدخول باستخدام مفتاح المرور الخاص بهم.
بالنسبة لقذيفة الويب ، يتم تمرير هذا ، من خلال قدرة passkey passkey إلى navigator.credentials.get 's Browser.
يقوم المستخدم بإدخال مفتاح Passkey وإرجاع قدرة passkey على كائن PublicKeyCredential ، عبر حدث Credential ، والذي يحتوي على التحدي الموقّع ، وغيرها من المعلومات.
تتم معالجة الحدث RequestCredential من قبل التطبيق ، وإرسال طلب POST ، عبر إمكانية crux_http ، إلى الواجهة الخلفية مع الكائن PublicKeyCredential .
تتحقق الواجهة الخلفية من المعلومات وتستجيب برمز الحالة 200 OK .
تتم معالجة حدث CredentialVerified من قبل التطبيق ، والذي يقوم بتحديث حالته للإشارة إلى أن المستخدم قد سجل الدخول.
يحتوي الدليل shared على جوهر التنفيذ. إنه مثال على تطبيق Root Crux الذي يعشق تطبيق auth Crux. يقوم تطبيق auth بتنظيم قدرات crux_http و passkey لتوفير تسجيل مفتاح Passkey وتسجيل الدخول مقابل الواجهة الخلفية.