إعادة المصادقة باستخدام مفتاح المرور

ميزات الويب: مصادقة الويب

يشرح هذا الدليل بالتفصيل كيفية تنفيذ المصادقة الإضافية أو إعادة التحقّق من هوية مستخدم سجّل الدخول قبل أن يُجري تغييرات حسّاسة في الحساب (مثل تعديل كلمات المرور أو إجراء تحويلات مالية).

بنية Delta Flow

على عكس المصادقة العادية، تقتصر إعادة المصادقة باستخدام مفتاح المرور على طلبات مربّعات حوار مفتاح المرور بشكل صارم على بيانات الاعتماد المسجّلة مسبقًا للمستخدم الذي سجّل الدخول لمنع خلط الحسابات أو انتحال مفتاح المرور أثناء الجلسات النشطة.

من جهة الخادم

Options Generation Delta

أنشئ نقطة نهاية تملأ مَعلمات بيانات الاعتماد المسموح بها خصيصًا للمستخدم النشط والمعروف:

تقييد بيانات الاعتماد: يمكنك ملء مصفوفة خيارات allowCredentials بسجلات PublicKeyCredentialDescriptor محدّدة تربط جميع أرقام تعريف بيانات الاعتماد المسجّلة للمستخدم الذي سجّل الدخول. ويؤدي ترك هذا الحقل فارغًا أو حذفه إلى العودة إلى بيانات الاعتماد القابلة للاكتشاف، ما ينتهك أمان الجلسة.

// Node.js step-up options generation example
router.post("/api/reauth/options", enforceActiveSession, async (req, res) => {
  const userPasskeys = await db.findCredentialsByUserId(req.user.id);

  const options = {
    challenge: serverGeneratedBase64UrlChallenge, // Random challenge stored in user session
    rpId: "example.com",
    // Enforce allowance strictly limited to the user's credentials list
    allowCredentials: userPasskeys.map((cred) => ({
      type: "public-key",
      id: cred.id,
      transports: cred.transports, // Speeds up resolution by indicating platform transports
    })),
  };
  return res.json(options);
});

الفرق في نقطة نهاية التحقّق

التحقّق من التأكيد الذي يعرضه العميل:

التحقّق من ملكية الحساب: يجب أن تتحقّق نقطة نهاية عملية التحقّق بشكل صريح من أنّ رقم تعريف بيانات اعتماد المصادقة الذي تمّت مصادقته والناتج عن العميل يؤدي إلى سجلّ بيانات اعتماد مخزَّن يتطابق رقم تعريف المستخدم المرتبط به تمامًا مع المستخدم النشط الذي سجّل الدخول (storedCredential.passkeyUserId === req.user.id). إذا تمّ عرض مفتاح مرور صالح لمستخدم مختلف، يجب رفض المصادقة على الفور.

فروق التدفق من جهة العميل

تختار التطبيقات من بين واجهتَي إعادة مصادقة استنادًا إلى واجهة مستخدم المعاملة:

أ. مسار الزر (بدون حقول إدخال)

يمكنك تفعيل إعادة المصادقة عندما يضغط المستخدم على زر "إثبات الهوية" أو "متابعة المعاملة".

<button id="reauth-btn" data-testid="reauth-button">Confirm Transaction</button>
let reauthAbortController = new AbortController();

async function triggerButtonReauth() {
  // Abort any background suggestion flows to avoid passkey prompt collisions
  reauthAbortController.abort();
  reauthAbortController = new AbortController();

  const optionsResponse = await fetch("/api/reauth/options", {
    method: "POST",
  });
  const optionsJSON = await optionsResponse.json();
  const publicKey =
    PublicKeyCredential.parseRequestOptionsFromJSON(optionsJSON);

  try {
    const credential = await navigator.credentials.get({
      publicKey,
      signal: reauthAbortController.signal,
    });

    if (credential) {
      const encodedCredential = credential.toJSON();
      const verifyResponse = await fetch("/api/reauth/verify", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify(encodedCredential),
      });

      if (verifyResponse.ok) {
        showTransactionSuccessUI();
      } else if (verifyResponse.status === 404 && PublicKeyCredential.signalUnknownCredential) {
        await PublicKeyCredential.signalUnknownCredential({
          rpId, // RP ID must match the one defined on the server
          credentialId: encodedCredential.id
        });
      }
    }
  } catch (err) {
    if (err.name === "NotAllowedError") {
      console.log("User cancelled reauthentication.");
    }
  }
}

document
  .getElementById("reauth-btn")
  .addEventListener("click", triggerButtonReauth);

الاستراتيجيات الاحتياطية

الاحتياطي لرصد ميزة مفتاح المرور

يجب دائمًا تثبيت "webauthn-polyfills" واستيراده في السياق. يُرجى العِلم أنّه طالما أنّ PublicKeyCredential متوافق، فإنّ PublicKeyCredential.getClientCapabilities متوافق أيضًا.

import 'webauthn-polyfills';

Easy JSON Serialization Fallback

يجب دائمًا تثبيت "webauthn-polyfills" واستيراده في السياق. يُرجى العِلم أنّه طالما أنّ PublicKeyCredential متوافق، يكون PublicKeyCredential.parseRequestOptionsFromJSON وPublicKeyCredential.prototype.toJSON متوافقَين أيضًا.

import 'webauthn-polyfills';