আবিষ্কারযোগ্য শংসাপত্র গভীর ডুব

ইজি কিতামুরা
ইজি কিতামুরা

যদিও FIDO শংসাপত্র যেমন পাসকিগুলির লক্ষ্য পাসওয়ার্ডগুলি প্রতিস্থাপন করা, সেগুলির বেশিরভাগই ব্যবহারকারীকে একটি ব্যবহারকারীর নাম টাইপ করা থেকে মুক্ত করতে পারে। এটি ব্যবহারকারীদের বর্তমান ওয়েবসাইটের জন্য তাদের কাছে থাকা পাসকিগুলির একটি তালিকা থেকে একটি অ্যাকাউন্ট নির্বাচন করে প্রমাণীকরণ করতে সক্ষম করে৷

নিরাপত্তা কীগুলির পূর্ববর্তী সংস্করণগুলি 2-পদক্ষেপ প্রমাণীকরণ পদ্ধতি হিসাবে ডিজাইন করা হয়েছিল, এবং সম্ভাব্য শংসাপত্রগুলির আইডি প্রয়োজন, এইভাবে একটি ব্যবহারকারীর নাম প্রবেশের প্রয়োজন৷ একটি নিরাপত্তা কী তাদের আইডি না জেনে যে শংসাপত্রগুলি খুঁজে পেতে পারে তাকে আবিষ্কারযোগ্য শংসাপত্র বলে। আজকে তৈরি বেশিরভাগ FIDO শংসাপত্রগুলি আবিষ্কারযোগ্য শংসাপত্র; বিশেষ করে পাসকীগুলি পাসওয়ার্ড ম্যানেজারে বা আধুনিক নিরাপত্তা কী-তে সংরক্ষিত।

আপনার শংসাপত্রগুলি আবিষ্কারযোগ্য তা নিশ্চিত করতে, পাসকি তৈরি করার সময় residentKey এবং requireResidentKey প্রয়োজন।

নির্ভরকারী পক্ষগুলি (RPs) পাসকি প্রমাণীকরণের সময় allowCredentials বাদ দিয়ে আবিষ্কারযোগ্য শংসাপত্র ব্যবহার করতে পারে। এই ক্ষেত্রে, ব্রাউজার বা সিস্টেম ব্যবহারকারীকে উপলব্ধ পাসকিগুলির একটি তালিকা দেখায়, তৈরির সময় user.name বৈশিষ্ট্য দ্বারা চিহ্নিত করা হয়। ব্যবহারকারী একটি নির্বাচন করলে, user.id মান ফলস্বরূপ স্বাক্ষরে অন্তর্ভুক্ত করা হবে। সার্ভার তারপরে একটি টাইপ করা ব্যবহারকারীর নামের পরিবর্তে অ্যাকাউন্টটি দেখতে সেটি বা ফেরত শংসাপত্র আইডি ব্যবহার করতে পারে।

অ্যাকাউন্ট নির্বাচক UI, যেমন আগে আলোচনা করা হয়েছে, কখনোই অ-আবিষ্কারযোগ্য শংসাপত্র দেখায় না।

ResidentKey এবং residentKey requireResidentKey

একটি আবিষ্কারযোগ্য শংসাপত্র তৈরি করতে, নিচে উল্লেখিত মানগুলির সাথে navigator.credentials.create()authenticatorSelection.residentKey এবং authenticatorSelection.requireResidentKey উল্লেখ করুন।

async function register () {
  // ...

  const publicKeyCredentialCreationOptions = {
    // ...
    authenticatorSelection: {
      authenticatorAttachment: 'platform',
      residentKey: 'required',
      requireResidentKey: true,
    }
  };

  const credential = await navigator.credentials.create({
    publicKey: publicKeyCredentialCreationOptions
  });

  // This does not run until the user selects a passkey.
  const credential = {};
  credential.id = cred.id;
  credential.rawId = cred.id; // Pass a Base64URL encoded ID string.
  credential.type = cred.type;

  // ...
}

residentKey :

  • 'required' : একটি আবিষ্কারযোগ্য শংসাপত্র তৈরি করতে হবে। এটি তৈরি করা না গেলে, NotSupportedError ফেরত দেওয়া হয়।
  • 'preferred' : RP একটি আবিষ্কারযোগ্য শংসাপত্র তৈরি করতে পছন্দ করে, কিন্তু একটি অ-আবিষ্কারযোগ্য শংসাপত্র গ্রহণ করে।
  • 'discouraged' : RP একটি অ-আবিষ্কারযোগ্য শংসাপত্র তৈরি করতে পছন্দ করে, কিন্তু একটি আবিষ্কারযোগ্য শংসাপত্র গ্রহণ করে।

requireResidentKey :

  • WebAuthn লেভেল 1, স্পেসিফিকেশনের একটি পুরানো সংস্করণ থেকে পশ্চাদগামী সামঞ্জস্যের জন্য এই সম্পত্তিটি ধরে রাখা হয়েছে। residentKey 'required' হলে এটি true সেট করুন, অন্যথায় এটি false সেট করুন।

allowCredentials

পাসকি প্রমাণীকরণ অভিজ্ঞতা নিয়ন্ত্রণ করতে RPs navigator.credentials.get() -এ allowCredentials ব্যবহার করতে পারে। সাধারণত তিন ধরনের পাসকি প্রমাণীকরণ অভিজ্ঞতা থাকে:

আবিষ্কারযোগ্য শংসাপত্রের সাথে, RPs ব্যবহারকারীর জন্য একটি মডেল অ্যাকাউন্ট নির্বাচক দেখাতে পারে যাতে ব্যবহারকারীর যাচাইকরণের মাধ্যমে সাইন ইন করার জন্য একটি অ্যাকাউন্ট নির্বাচন করতে পারে। এটি পাসকি প্রমাণীকরণের জন্য উত্সর্গীকৃত একটি বোতাম টিপে শুরু করা পাসকি প্রমাণীকরণ প্রবাহের জন্য উপযুক্ত।

এই ব্যবহারকারীর অভিজ্ঞতা অর্জন করতে, navigator.credentials.get() -এ allowCredentials প্যারামিটারে একটি খালি অ্যারে বাদ দিন বা পাস করুন।

async function authenticate() {
  // ...

  const publicKeyCredentialRequestOptions = {
    // Server generated challenge:
    challenge: ****,
    // The same RP ID as used during registration:
    rpId: 'example.com',
    // You can omit `allowCredentials` as well:
    allowCredentials: []
  };

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

  // This does not run until the user selects a passkey.
  const credential = {};
  credential.id = cred.id;
  credential.rawId = cred.id; // Pass a Base64URL encoded ID string.
  credential.type = cred.type;
  
  // ...
}

একটি পাসকি ফর্ম অটোফিল দেখান

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

পরিবর্তে, সংরক্ষিত ব্যবহারকারীর নাম এবং পাসওয়ার্ডের পাশাপাশি, একটি পাসকি নির্বাচন একটি ঐতিহ্যগত সাইন-ইন ফর্মে ক্ষেত্রের জন্য স্বতঃপূর্ণ প্রম্পটে ভাঁজ করা যেতে পারে। এইভাবে, পাসকি সহ একজন ব্যবহারকারী তাদের পাসকি নির্বাচন করে সাইন-ইন ফর্ম "পূরন" করতে পারে, সংরক্ষিত ব্যবহারকারীর নাম/পাসওয়ার্ড জোড়া আছে এমন ব্যবহারকারীরা সেগুলি নির্বাচন করতে পারে এবং কোনটি নেই এমন ব্যবহারকারীরা এখনও তাদের ব্যবহারকারীর নাম এবং পাসওয়ার্ড টাইপ করতে পারে না।

পাসওয়ার্ড এবং পাসকির মিশ্র ব্যবহার সহ RP যখন মাইগ্রেশনের অধীনে থাকে তখন এই ব্যবহারকারীর অভিজ্ঞতা আদর্শ।

এই ব্যবহারকারীর অভিজ্ঞতা অর্জন করতে, allowCredentials সম্পত্তির অনুমতি দেওয়ার জন্য একটি খালি অ্যারে পাস করা বা প্যারামিটারটি বাদ দেওয়ার পাশাপাশি, মধ্যস্থতা নির্দিষ্ট করুন: navigator.credentials.get() -এ mediation: 'conditional' এবং autocomplete="username webauthn" বা সহ একটি HTML username ইনপুট ক্ষেত্র টীকা করুন autocomplete="password webauthn" সহ একটি password ইনপুট ক্ষেত্র।

navigator.credentials.get() এ কল করলে কোনো UI দেখানো হবে না, কিন্তু ব্যবহারকারী যদি টীকা করা ইনপুট ক্ষেত্রে ফোকাস করে, তাহলে যেকোনও উপলব্ধ পাসকিগুলি স্বয়ংক্রিয়ভাবে পূরণ করার বিকল্পগুলিতে অন্তর্ভুক্ত করা হবে। ব্যবহারকারী একটি নির্বাচন করলে, তারা নিয়মিত ডিভাইস আনলক যাচাইকরণের মধ্য দিয়ে যাবে, এবং শুধুমাত্র তখনই .get() দ্বারা প্রত্যাবর্তিত প্রতিশ্রুতি একটি ফলাফলের সাথে সমাধান হবে। যদি ব্যবহারকারী একটি পাসকি নির্বাচন না করে, তবে প্রতিশ্রুতি কখনই সমাধান হয় না।

async function authenticate() {
  // ...

  const publicKeyCredentialRequestOptions = {
    // Server generated challenge:
    challenge: ****,
    // The same RP ID as used during registration:
    rpId: 'example.com',
    // You can omit `allowCredentials` as well:
    allowCredentials: []
  };

  const cred = await navigator.credentials.get({
    publicKey: publicKeyCredentialRequestOptions,
    signal: abortController.signal,
    // Specify 'conditional' to activate conditional UI
    mediation: 'conditional'
  });

  // This does not run until the user selects a passkey.
  const credential = {};
  credential.id = cred.id;
  credential.rawId = cred.id; // Pass a Base64URL encoded ID string.
  credential.type = cred.type;
  
  // ...
}
<input type="text" name="username" autocomplete="username webauthn" ...>

আপনি ফর্ম অটোফিল এর মাধ্যমে একটি পাসকি দিয়ে সাইন ইন করে এই ব্যবহারকারীর অভিজ্ঞতা তৈরি করতে শিখতে পারেন, সেইসাথে একটি ওয়েব অ্যাপ কোডল্যাবে ফর্ম অটোফিল সহ পাসকিগুলি প্রয়োগ করুন

পুনরায় প্রমাণীকরণ

কিছু ক্ষেত্রে, যেমন পুনরায় প্রমাণীকরণের জন্য পাসকি ব্যবহার করার সময়, ব্যবহারকারীর সনাক্তকারী ইতিমধ্যেই পরিচিত। এই ক্ষেত্রে, আমরা ব্রাউজার বা OS ছাড়াই একটি পাসকি ব্যবহার করতে চাই যা একটি অ্যাকাউন্ট নির্বাচকের কোনো রূপ দেখায়৷ এটি allowCredentials প্যারামিটারে শংসাপত্র আইডিগুলির একটি তালিকা পাস করে অর্জন করা যেতে পারে।

সেক্ষেত্রে, যদি কোনো নামকৃত শংসাপত্র স্থানীয়ভাবে পাওয়া যায়, ব্যবহারকারীকে সরাসরি ডিভাইস আনলক করার জন্য অনুরোধ করা হয়। যদি না হয়, ব্যবহারকারীকে অন্য একটি ডিভাইস (একটি ফোন বা একটি নিরাপত্তা কী) উপস্থাপন করার জন্য অনুরোধ করা হয় যা একটি বৈধ শংসাপত্র ধারণ করে৷

এই ব্যবহারকারীর অভিজ্ঞতা অর্জন করতে, সাইন ইন ব্যবহারকারীর জন্য শংসাপত্র আইডিগুলির একটি তালিকা প্রদান করুন৷ RP তাদের জিজ্ঞাসা করতে সক্ষম হওয়া উচিত কারণ ব্যবহারকারী ইতিমধ্যে পরিচিত। navigator.credentials.get()allowCredentials প্রপার্টিতে PublicKeyCredentialDescriptor অবজেক্ট হিসাবে শংসাপত্র আইডি প্রদান করুন।

async function authenticate() {
  // ...

  const publicKeyCredentialRequestOptions = {
    // Server generated challenge:
    challenge: ****,
    // The same RP ID as used during registration:
    rpId: 'example.com',
    // Provide a list of PublicKeyCredentialDescriptors:
    allowCredentials: [{
      id: ****,
      type: 'public-key',
      transports: [
        'internal',
        'hybrid'
      ]
    }, {
      id: ****,
      type: 'public-key',
      transports: [
        'internal',
        'hybrid'
      ]
    }, ...]
  };

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

  // This does not run until the user selects a passkey.
  const credential = {};
  credential.id = cred.id;
  credential.rawId = cred.id; // Pass a Base64URL encoded ID string.
  credential.type = cred.type;
  
  // ...
}

একটি PublicKeyCredentialDescriptor বস্তুর মধ্যে রয়েছে:

  • id : পাসকি রেজিস্ট্রেশনে RP প্রাপ্ত পাবলিক কী শংসাপত্রের একটি আইডি।
  • type : এই ক্ষেত্রটি সাধারণত 'public-key' হয়।
  • transports : এই শংসাপত্র ধারণকারী ডিভাইস দ্বারা সমর্থিত পরিবহনের একটি ইঙ্গিত, ব্রাউজার দ্বারা ব্যবহৃত UI অপ্টিমাইজ করতে যা ব্যবহারকারীকে একটি বহিরাগত ডিভাইস উপস্থাপন করতে বলে। এই তালিকা, প্রদান করা হলে, প্রতিটি শংসাপত্রের নিবন্ধনের সময় getTransports() কল করার ফলাফল থাকা উচিত।

সারসংক্ষেপ

আবিষ্কারযোগ্য শংসাপত্রগুলি পাসকি সাইন-ইন অভিজ্ঞতাকে অনেক বেশি ব্যবহারকারী বান্ধব করে তোলে যাতে তারা একটি ব্যবহারকারীর নাম প্রবেশ করা এড়িয়ে যায়। residentKey , requireResidentKey , এবং allowCredentials এর সংমিশ্রণে RPs সাইন-ইন করার অভিজ্ঞতা অর্জন করতে পারে যা:

  • একটি মডেল অ্যাকাউন্ট নির্বাচক দেখান।
  • একটি পাসকি ফর্ম অটোফিল দেখান।
  • পুনরায় প্রমাণীকরণ।

বুদ্ধিমানের সাথে আবিষ্কারযোগ্য শংসাপত্রগুলি ব্যবহার করুন। এটি করার মাধ্যমে, আপনি পরিশীলিত পাসকি সাইন-ইন অভিজ্ঞতা ডিজাইন করতে পারেন যা ব্যবহারকারীরা নির্বিঘ্ন খুঁজে পাবে এবং এর সাথে জড়িত হওয়ার সম্ভাবনা বেশি হবে৷