পাসকী আবার যাচাই করা

ওয়েব ফিচার: ওয়েব যাচাইকরণ

এই ডেল্টা-ফোকাসড গাইডে বিস্তারিতভাবে বলা হয়েছে যে সাইন-ইন করা ব্যবহারকারী অ্যাকাউন্টে সংবেদনশীল পরিবর্তন (যেমন, পাসওয়ার্ড আপডেট, আর্থিক ট্রান্সফার) করার আগে কীভাবে স্টেপ-আপ যাচাইকরণ বা আবার যাচাইকরণ প্রয়োগ করতে হয়।

ডেল্টা ফ্লো আর্কিটেকচার

নিয়মিত যাচাইকরণের মতো নয়, পাসকী আবার যাচাইকরণ, পাসকী ডায়ালগ প্রম্পটকে লগ-ইন করা ব্যবহারকারীর আগে থেকে রেজিস্টার করা ক্রেডেনশিয়ালের সাথে কঠোরভাবে সীমাবদ্ধ করে যাতে অ্যাক্টিভ সেশন চলাকালীন অ্যাকাউন্ট-মিক্সিং বা পাসকী স্পুফিং প্রতিরোধ করা যায়।

সার্ভার-সাইড

বিকল্প জেনারেশন ডেল্টা

একটি এন্ডপয়েন্ট তৈরি করুন যা অ্যাক্টিভ, পরিচিত ব্যবহারকারীর জন্য বিশেষভাবে অনুমোদিত ক্রেডেনশিয়াল প্যারামিটার পূরণ করে:

ক্রেডেনশিয়াল সীমাবদ্ধ করা: সাইন-ইন করা ব্যবহারকারীর জন্য রেজিস্টার করা সব ক্রেডেনশিয়াল আইডি ম্যাপ করে নির্দিষ্ট PublicKeyCredentialDescriptor রেকর্ড সহ allowCredentials বিকল্প অ্যারে পপুলেট করুন। এটি খালি রাখলে বা বাদ দিলে, খুঁজে পাওয়ার যোগ্য ক্রেডেনশিয়াল ফিরে আসে, যা সেশনের নিরাপত্তা লঙ্ঘন করে।

// 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) সাথে হুবহু মিলে যায়। যদি কোনও অন্য ব্যবহারকারীর বৈধ পাসকী ফেরত আসে, তাহলে যাচাইকরণ অবিলম্বে বাতিল করতে হবে।

ক্লায়েন্ট-সাইড ফ্লো ডেল্টা

ট্রানজ্যাকশন UI-এর উপর নির্ভর করে অ্যাপ্লিকেশন দুটি রি-অথেন্টিকেশন ইন্টারফেস থেকে বেছে নেয়:

ক. বোতাম ফ্লো (কোনও ইনপুট ফিল্ড নেই)

ব্যবহারকারী "পরিচয় যাচাই করুন" বা "ট্রানজ্যাকশন নিয়ে এগিয়ে যান" বোতামে প্রেস করলে, আবার যাচাইকরণ ট্রিগার করুন।

<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';