تعرف على كيفية اعتماد Passkeys المبنية على WebAuthn وFIDO2 لإزالة كلمات المرور، تقليل الاختراقات، ورفع التحويل عبر تسجيل دخول بنقرة واحدة — مع أمثلة كود، مقارنة، وقائمة فحص جاهزة للتنفيذ.
لماذا Passkeys الآن؟
كلمات المرور سبب رئيسي للاختراقات: إعادة استخدام، تصيّد، وتعب من المستخدم. Passkeys تقدم تسجيل دخول أسهل وأأمن عبر بصمة الإصبع أو التعرف على الوجه أو رمز الجهاز — بدون حفظ أسرار قابلة للسرقة على الخادم.
كيف تعمل Passkeys؟
عند التسجيل، ينشئ جهاز المستخدم زوج مفاتيح عام/خاص. يُخزَّن المفتاح العام فقط لدى خادمك، بينما يبقى الخاص في الجهاز محميًا بالمقاييس الحيوية. عند تسجيل الدخول، يوقّع الجهاز تحدّيًا من الخادم ويعيد توقيعًا يمكن التحقق منه.
الدعم والمتصفحات
تدعم جميع المتصفحات الحديثة WebAuthn، مع تكامل عميق في iOS/Android وبيئات سطح المكتب. وفّر مسارًا احتياطيًا (OTP بالبريد/الهاتف) للمستخدمين القدامى.
البدء السريع — مثال واجهة
الكود التالي يطلب إنشاء Passkey من المتصفح ويعرض رسالة نجاح. افصل منطق جلب challenge من خادمك:
// client.js — إنشاء Passkey
const makePasskey = async () => {
// 1) اجلب challenge و rpId و userId من خادمك
const { challenge, rpId, user } = await fetch("/webauthn/register/options").then(r=>r.json());
// 2) نطلب من المتصفح إنشاء credential
const cred = await navigator.credentials.create({
publicKey: {
challenge: Uint8Array.from(atob(challenge), c => c.charCodeAt(0)),
rp: { id: rpId, name: "موقعك" },
user: {
id: Uint8Array.from(atob(user.id), c => c.charCodeAt(0)),
name: user.name,
displayName: user.displayName
},
pubKeyCredParams: [{ type: "public-key", alg: -7 }, { type: "public-key", alg: -257 }],
authenticatorSelection: { residentKey: "preferred", userVerification: "required" },
timeout: 60000
}
});
// 3) أرسل النتيجة للتحقق والتخزين
const res = await fetch("/webauthn/register/verify", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
id: cred.id,
rawId: btoa(String.fromCharCode(...new Uint8Array(cred.rawId))),
type: cred.type,
response: {
clientDataJSON: btoa(String.fromCharCode(...new Uint8Array(cred.response.clientDataJSON))),
attestationObject: btoa(String.fromCharCode(...new Uint8Array(cred.response.attestationObject)))
}
})
}).then(r=>r.json());
alert(res.ok ? "تم إنشاء Passkey بنجاح" : "فشل التسجيل");
};
للتسجيل الدخول لاحقًا، استخدم navigator.credentials.get({ publicKey: {...} })
مع challenge جديد.
الجانب الخادمي — مثال مبسّط
الخطوات الأساسية: إنشاء challenge، حفظه مؤقتًا للجلسة، ثم التحقق من التوقيع وإتمام التسجيل.
// server.js (مثال مبسّط بفكرة عامة)
import express from "express";
import base64url from "base64url";
// استخدم مكتبة WebAuthn جاهزة في مشروعك الحقيقي للتحقق من attestation/assertion
const app = express();
app.use(express.json());
// تُنشئ خيارات التسجيل
app.get("/webauthn/register/options", (req, res) => {
const challenge = base64url(Buffer.from(crypto.randomUUID()));
// خزّن challenge في جلسة المستخدم للتحقق لاحقًا
req.session.challenge = challenge;
res.json({
challenge,
rpId: "example.com",
user: {
id: base64url(Buffer.from("user-123")),
name: "user@example.com",
displayName: "User 123"
}
});
});
// التحقق وتخزين المفتاح العام
app.post("/webauthn/register/verify", async (req, res) => {
// 1) استخرج clientDataJSON و attestationObject
// 2) تحقّق من challenge و origin و type
// 3) استخرج المفتاح العام من attestation وخزّنه للمستخدم
// 4) أعد استجابة نجاح
res.json({ ok: true });
});
app.listen(3000);
في الإنتاج استخدم مكتبات موثوقة (Node/Go/Python/Java) للتعامل مع attestation/assertion والتحقق من التواقيع.
أفضل ممارسات تجربة المستخدم
- اعرض خيار “تسجيل الدخول باستخدام Passkey” أولًا إن كان المستخدم سبق أن سجّل Passkey.
- وفّر مسارًا احتياطيًا (رمز لمرة واحدة) ومركز استرداد آمن.
- اشرح للمستخدمين بوضوح أن بياناتهم لا تُخزن ككلمات مرور وأن المصادقة بيومترية على أجهزتهم.
- ادعم المزامنة عبر حسابات المنصات (Google/Apple/Microsoft) لتسهيل الأجهزة المتعددة.
navigator.credentials.get
تلقائيًا بعد تركيز حقل البريد لاقتراح Passkey موجودة وتقليل الاحتكاك.
مقارنة: كلمات المرور vs Passkeys
البند | كلمات المرور | Passkeys |
---|---|---|
سهولة الاستخدام | تذكّر/لصق/مدير كلمات | نقرة واحدة/بيومتريات |
الأمان | تسرّب/تصيّد/إعادة استخدام | لا يمكن تصيّد المفتاح الخاص |
الدعم | إعادة تعيين متكرر | أقل تذاكر دعم |
التوافق | واسع | حديث لكنه مدعوم في المتصفحات الكبرى |
قائمة فحص قبل الإطلاق ميزة إضافية
- تفعيل HTTPS وقيود
RP ID
الصحيحة لنطاقك. - تخزين آمن للمفاتيح العامة وربطها بحساب المستخدم.
- مسار احتياطي واسترداد آمن (OTP/دعم).
- واجهة واضحة: أزرار Passkey + نص توضيحي قصير.
- اختبارات على iOS/Android/سطح المكتب وأجهزة متعددة.
أسئلة شائعة
هل أحتاج تطبيق جوّال مخصص؟
لا، المتصفح يكفي. لكن تطبيقات الموبايل يمكنها استخدام واجهات FIDO الأصلية أيضًا.
كيف يتعامل المستخدم مع جهاز جديد؟
المفاتيح تُزامن عبر حساب النظام (مثل iCloud/Google)، أو يمكن إضافة Passkey جديدة بعد تسجيل الدخول الاحتياطي.
هل يمكن الدمج مع تسجيل اجتماعي؟
نعم، Passkeys تكمل تسجيل Google/Apple وتقلل الاعتماد على كلمات المرور تمامًا.
الخلاصة
اعتماد Passkeys خطوة استراتيجية لرفع الأمان والتحويل في آن واحد. ابدأ بمسار اختباري لمجموعة من المستخدمين، حسّن الواجهة والنسخ التوعوي، ثم عمّم التجربة — وستلاحظ انخفاضًا في مشاكل تسجيل الدخول وارتفاعًا في رضا المستخدم.
نصيحة أخيرة: احرص على مسار بديل وخطة استرداد واضحة لضمان انتقال سلس من كلمات المرور.