আপনার অ্যান্ড্রয়েড অ্যাপে ক্রেডেনশিয়াল ম্যানেজার API ব্যবহার করে প্রমাণীকরণের যাত্রাকে কীভাবে সহজ করা যায় তা জানুন

1. আপনি শুরু করার আগে

ঐতিহ্যগত প্রমাণীকরণ সমাধানগুলি বেশ কয়েকটি নিরাপত্তা এবং ব্যবহারযোগ্যতার চ্যালেঞ্জ তৈরি করে।

পাসওয়ার্ড ব্যাপকভাবে ব্যবহৃত হয় কিন্তু...

  • সহজেই ভুলে যায়
  • শক্তিশালী পাসওয়ার্ড তৈরি করতে ব্যবহারকারীদের জ্ঞান প্রয়োজন।
  • আক্রমণকারীদের দ্বারা ফিশ, ফসল কাটা এবং রিপ্লে করা সহজ।

সাইন-ইন অভিজ্ঞতা সহজতর করার জন্য এবং পাসকিগুলিকে সমর্থন করে নিরাপত্তা ঝুঁকি মোকাবেলা করার জন্য অ্যান্ড্রয়েড ক্রেডেনশিয়াল ম্যানেজার এপিআই তৈরির দিকে কাজ করেছে, পাসওয়ার্ডবিহীন প্রমাণীকরণের জন্য পরবর্তী প্রজন্মের শিল্প মান।

ক্রেডেনশিয়াল ম্যানেজার পাসকিগুলির জন্য সমর্থন নিয়ে আসে এবং এটিকে ঐতিহ্যগত প্রমাণীকরণ পদ্ধতি যেমন পাসওয়ার্ড, Google এর সাথে সাইন ইন ইত্যাদির সাথে একত্রিত করে।

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

এই কোডল্যাবে, আপনি শিখবেন কিভাবে পাসকি এবং পাসওয়ার্ড ব্যবহার করে ক্রেডেনশিয়াল ম্যানেজার API ব্যবহার করে সাইন আপ করবেন এবং ভবিষ্যতে প্রমাণীকরণের উদ্দেশ্যে ব্যবহার করবেন। 2টি প্রবাহ রয়েছে যার মধ্যে রয়েছে:

  • সাইন আপ করুন: পাসকি এবং পাসওয়ার্ড ব্যবহার করে।
  • সাইন ইন করুন: পাসকি এবং সংরক্ষিত পাসওয়ার্ড ব্যবহার করে।

পূর্বশর্ত

  • অ্যান্ড্রয়েড স্টুডিওতে অ্যাপ্লিকেশান চালানোর প্রাথমিক ধারণা।
  • অ্যান্ড্রয়েড অ্যাপে প্রমাণীকরণ প্রবাহের প্রাথমিক ধারণা।
  • পাসকি সম্পর্কে প্রাথমিক ধারণা।

আপনি কি শিখবেন

  • কিভাবে একটি পাসকি তৈরি করতে হয়।
  • পাসওয়ার্ড ম্যানেজারে কীভাবে পাসওয়ার্ড সংরক্ষণ করবেন।
  • কিভাবে একটি পাসকি বা সংরক্ষিত পাসওয়ার্ড দিয়ে ব্যবহারকারীদের প্রমাণীকরণ করা যায়।

আপনি কি প্রয়োজন হবে

নিম্নলিখিত ডিভাইস সংমিশ্রণগুলির মধ্যে একটি:

  • একটি অ্যান্ড্রয়েড ডিভাইস যা অ্যান্ড্রয়েড 9 বা উচ্চতর (পাসকিগুলির জন্য) এবং অ্যান্ড্রয়েড 4.4 বা উচ্চতর (ক্রেডেনশিয়াল ম্যানেজার API এর মাধ্যমে পাসওয়ার্ড প্রমাণীকরণের জন্য) চালায়।
  • বায়োমেট্রিক সেন্সর সহ ডিভাইসটি পছন্দ করুন।
  • একটি বায়োমেট্রিক (বা স্ক্রিন লক) নিবন্ধন নিশ্চিত করুন৷
  • কোটলিন প্লাগইন সংস্করণ: 1.8.10

2. সেট আপ করুন

  1. credman_codelab শাখা থেকে আপনার ল্যাপটপে এই রেপোটি ক্লোন করুন: https://github.com/android/identity-samples/tree/credman_codelab
  2. ক্রেডেনশিয়াল ম্যানেজার মডিউলে যান এবং অ্যান্ড্রয়েড স্টুডিওতে প্রকল্পটি খুলুন।

অ্যাপের প্রাথমিক অবস্থা দেখা যাক

অ্যাপটির প্রাথমিক অবস্থা কীভাবে কাজ করে তা দেখতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. অ্যাপটি চালু করুন।
  2. আপনি একটি সাইন আপ এবং সাইন ইন বোতাম সহ একটি প্রধান স্ক্রীন দেখতে পাবেন।
  3. আপনি একটি পাসকি বা একটি পাসওয়ার্ড ব্যবহার করে সাইন আপ করতে সাইন আপ ক্লিক করতে পারেন৷
  4. আপনি পাসকি এবং সংরক্ষিত পাসওয়ার্ড ব্যবহার করে সাইন ইন করতে সাইন ইন ক্লিক করতে পারেন।

8c0019ff9011950a.jpeg

পাসকিগুলি কী এবং তারা কীভাবে কাজ করে তা বোঝার জন্য, পাসকিগুলি কীভাবে কাজ করে দেখুন? .

3. পাসকি ব্যবহার করে সাইন আপ করার ক্ষমতা যোগ করুন

ক্রেডেনশিয়াল ম্যানেজার API ব্যবহার করে এমন একটি Android অ্যাপে একটি নতুন অ্যাকাউন্টের জন্য সাইন আপ করার সময়, ব্যবহারকারীরা তাদের অ্যাকাউন্টের জন্য একটি পাসকি তৈরি করতে পারেন। এই পাসকি নিরাপদে ব্যবহারকারীর নির্বাচিত শংসাপত্র প্রদানকারীতে সংরক্ষণ করা হবে এবং ভবিষ্যতে সাইন-ইন করার জন্য ব্যবহার করা হবে, ব্যবহারকারীকে প্রতিবার তাদের পাসওয়ার্ড লিখতে হবে না।

এখন, আপনি একটি পাসকি তৈরি করবেন এবং বায়োমেট্রিক্স/স্ক্রিন লক ব্যবহার করে ব্যবহারকারীর শংসাপত্র নিবন্ধন করবেন।

পাসকি দিয়ে সাইন আপ করুন

ক্রেডেনশিয়াল ম্যানেজার -> অ্যাপ -> প্রধান -> java -> SignUpFragment.kt এর ভিতরে, আপনি একটি পাঠ্য ক্ষেত্র "ব্যবহারকারীর নাম" এবং পাসকি দিয়ে সাইন আপ করার জন্য একটি বোতাম দেখতে পাবেন।

dcc5c529b310f2fb.jpeg

CreatePasskey() কলে চ্যালেঞ্জ এবং অন্যান্য json প্রতিক্রিয়া পাস করুন

একটি পাসকি তৈরি করার আগে, createCredential () কলের সময় আপনাকে প্রয়োজনীয় তথ্য ক্রেডেনশিয়াল ম্যানেজার API-এ পাস করার জন্য সার্ভারকে অনুরোধ করতে হবে।

সৌভাগ্যবশত, আপনার সম্পদে ( RegFromServer.txt ) ইতিমধ্যেই একটি উপহাস প্রতিক্রিয়া রয়েছে যা এই কোডল্যাবে এই ধরনের পরামিতি প্রদান করে।

  • আপনার অ্যাপে, SignUpFragment.kt , Find, signUpWithPasskeys পদ্ধতিতে নেভিগেট করুন যেখানে আপনি একটি পাসকি তৈরি এবং ব্যবহারকারীকে প্রবেশ করতে দেওয়ার জন্য যুক্তি লিখবেন৷ আপনি একই ক্লাসে পদ্ধতিটি খুঁজে পেতে পারেন৷
  • createPasskey() কল করার জন্য একটি মন্তব্য সহ অন্য ব্লক চেক করুন এবং নিম্নলিখিত কোড দিয়ে প্রতিস্থাপন করুন:

SignUpFragment.kt

//TODO : Call createPasskey() to signup with passkey

val data = createPasskey()

একবার আপনার স্ক্রিনে একটি বৈধ ব্যবহারকারীর নাম পূরণ হলে এই পদ্ধতিটি বলা হবে।

  • createPasskey() পদ্ধতির ভিতরে, আপনাকে একটি CreatePublicKeyCredentialRequest() তৈরি করতে হবে প্রয়োজনীয় প্যারামগুলি ফেরত দিয়ে।

SignUpFragment.kt

//TODO create a CreatePublicKeyCredentialRequest() with necessary registration json from server

val request = CreatePublicKeyCredentialRequest(fetchRegistrationJsonFromServer())

এই fetchRegistrationJsonFromServer() একটি পদ্ধতি, যা সম্পদ থেকে রেজিস্ট্রেশন json প্রতিক্রিয়া পড়ে এবং পাসকি তৈরি করার সময় পাস করা নিবন্ধন json ফেরত দেয়।

  • fetchRegistrationJsonFromServer() পদ্ধতি খুঁজুন এবং json রিটার্ন করতে নিম্নলিখিত কোড দিয়ে TODO প্রতিস্থাপন করুন এবং খালি স্ট্রিং রিটার্ন স্টেটমেন্টও সরিয়ে দিন :

SignUpFragment.kt

//TODO fetch registration mock response

val response = requireContext().readFromAsset("RegFromServer")

//Update userId,challenge, name and Display name in the mock
return response.replace("<userId>", getEncodedUserId())
   .replace("<userName>", binding.username.text.toString())
   .replace("<userDisplayName>", binding.username.text.toString())
   .replace("<challenge>", getEncodedChallenge())
  • এখানে, আপনি সম্পদ থেকে নিবন্ধন json পড়েন।
  • এই json এর 4টি ক্ষেত্র প্রতিস্থাপন করা হবে।
  • UserId অনন্য হতে হবে যাতে একজন ব্যবহারকারী একাধিক পাসকি তৈরি করতে পারে (যদি প্রয়োজন হয়)। আপনি উত্পন্ন userId দিয়ে <userId> প্রতিস্থাপন করুন।
  • <চ্যালেঞ্জ>ও অনন্য হতে হবে তাই আপনি একটি এলোমেলো অনন্য চ্যালেঞ্জ তৈরি করবেন। পদ্ধতিটি ইতিমধ্যে আপনার কোডে রয়েছে।

নিম্নলিখিত কোড স্নিপেটে নমুনা বিকল্পগুলি অন্তর্ভুক্ত রয়েছে যা আপনি সার্ভার থেকে পান:

{
  "challenge": String,
  "rp": {
    "name": String,
    "id": String
  },
  "user": {
    "id": String,
    "name": String,
    "displayName": String
  },
  "pubKeyCredParams": [
    {
      "type": "public-key",
      "alg": -7
    },
    {
      "type": "public-key",
      "alg": -257
    }
  ],
  "timeout": 1800000,
  "attestation": "none",
  "excludeCredentials": [],
  "authenticatorSelection": {
    "authenticatorAttachment": "platform",
    "requireResidentKey": true,
    "residentKey": "required",
    "userVerification": "required"
  }
}

নিম্নলিখিত সারণীটি সম্পূর্ণ নয়, তবে এতে PublicKeyCredentialCreationOptions অভিধানে গুরুত্বপূর্ণ প্যারামিটার রয়েছে:

পরামিতি

বর্ণনা

challenge

একটি সার্ভার-উত্পাদিত র্যান্ডম স্ট্রিং যাতে এটি অনুমান করা অসম্ভব করে তোলার জন্য যথেষ্ট এনট্রপি রয়েছে৷ এটি কমপক্ষে 16 বাইট দীর্ঘ হওয়া উচিত। এটি প্রয়োজনীয় কিন্তু নিবন্ধনের সময় অব্যবহৃত হয় যদি না সত্যায়ন না করা হয়।

user.id

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

user.name

এই ক্ষেত্রটিতে অ্যাকাউন্টের জন্য একটি অনন্য শনাক্তকারী রাখা উচিত যা ব্যবহারকারী তাদের ইমেল ঠিকানা বা ব্যবহারকারীর নামের মতো চিনতে পারবে। এটি অ্যাকাউন্ট নির্বাচনকারীতে প্রদর্শিত হবে। (যদি একটি ব্যবহারকারীর নাম ব্যবহার করে, পাসওয়ার্ড প্রমাণীকরণের মতো একই মান ব্যবহার করুন।)

user.displayName

এই ক্ষেত্রটি অ্যাকাউন্টের জন্য একটি ঐচ্ছিক, আরও ব্যবহারকারী-বান্ধব নাম। এটি ব্যবহারকারীর অ্যাকাউন্টের জন্য একটি মানব-সুস্বাদু নাম, শুধুমাত্র প্রদর্শনের উদ্দেশ্যে।

rp.id

রিলাইং পার্টি এন্টিটি আপনার আবেদনের বিবরণের সাথে মিলে যায়। এর প্রয়োজন:

  • একটি নাম (প্রয়োজনীয়): আপনার আবেদনের নাম
  • একটি আইডি (ঐচ্ছিক): ডোমেন বা সাবডোমেনের সাথে মিলে যায়। অনুপস্থিত থাকলে, বর্তমান ডোমেন ব্যবহার করা হয়।
  • একটি আইকন (ঐচ্ছিক)।

pubKeyCredParams

পাবলিক কী ক্রেডেনশিয়াল পরামিতি হল অনুমোদিত অ্যালগরিদম এবং কী ধরনের একটি তালিকা। এই তালিকায় অন্তত একটি উপাদান থাকতে হবে।

excludeCredentials

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

authenticatorSelection.authenticatorAttachment

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

residentKey

একটি পাসকি তৈরি করতে একটি মান "প্রয়োজনীয়" নির্দেশ করুন।

একটি শংসাপত্র তৈরি করুন

  1. একবার আপনি একটি CreatePublicKeyCredentialRequest() তৈরি করলে, আপনাকে তৈরি করা অনুরোধের সাথে createCredential () কল করতে হবে।

SignUpFragment.kt

//TODO call createCredential() with createPublicKeyCredentialRequest

try {
   response = credentialManager.createCredential(
       requireActivity(),
       request
   ) as CreatePublicKeyCredentialResponse
} catch (e: CreateCredentialException) {
   configureProgress(View.INVISIBLE)
   handlePasskeyFailure(e)
}
  • আপনি Credential() তৈরি করতে প্রয়োজনীয় তথ্য পাস করেন।
  • একবার অনুরোধ সফল হলে, আপনি আপনার স্ক্রিনে একটি নীচের শীট দেখতে পাবেন যা আপনাকে একটি পাসকি তৈরি করতে অনুরোধ করবে।
  • এখন ব্যবহারকারীরা বায়োমেট্রিক্স বা স্ক্রিন লক ইত্যাদির মাধ্যমে তাদের পরিচয় যাচাই করতে পারবেন।
  • আপনি রেন্ডার করা দৃশ্যের দৃশ্যমানতা পরিচালনা করেন এবং কোনো কারণে অনুরোধ ব্যর্থ হলে বা ব্যর্থ হলে ব্যতিক্রমগুলি পরিচালনা করেন। এখানে ত্রুটির বার্তাগুলি লগ করা হয়েছে এবং একটি ত্রুটি ডায়ালগে অ্যাপটিতে দেখানো হয়েছে৷ আপনি অ্যান্ড্রয়েড স্টুডিও বা অ্যাডবি ডিবাগ কমান্ডের মাধ্যমে সম্পূর্ণ ত্রুটির লগগুলি পরীক্ষা করতে পারেন

93022cb87c00f1fc.png

  1. এখন, অবশেষে আপনাকে সার্ভারে সর্বজনীন কী শংসাপত্র পাঠিয়ে এবং ব্যবহারকারীকে প্রবেশ করতে দিয়ে নিবন্ধন প্রক্রিয়াটি সম্পূর্ণ করতে হবে৷ অ্যাপটি একটি শংসাপত্রের বস্তু পায় যাতে একটি সর্বজনীন কী রয়েছে যা আপনি পাসকি নিবন্ধন করতে সার্ভারে পাঠাতে পারেন৷

এখানে, আমরা একটি মক সার্ভার ব্যবহার করেছি, তাই আমরা সত্য ফেরত দিয়েছি যে সার্ভার ভবিষ্যতে প্রমাণীকরণ এবং বৈধতার উদ্দেশ্যে নিবন্ধিত সর্বজনীন কী সংরক্ষণ করেছে।

SignUpWithPasskeys() পদ্ধতির ভিতরে, প্রাসঙ্গিক মন্তব্য খুঁজুন এবং নিম্নলিখিত কোড দিয়ে প্রতিস্থাপন করুন:

SignUpFragment.kt

//TODO : complete the registration process after sending public key credential to your server and let the user in

data?.let {
   registerResponse()
   DataProvider.setSignedInThroughPasskeys(true)
   listener.showHome()
}
  • registerResponse রিটার্ন সত্য নির্দেশক (মক) সার্ভার ভবিষ্যতে ব্যবহারের জন্য সর্বজনীন কী সংরক্ষণ করেছে।
  • আপনি সাইনডইনথ্রুফপাসকিগুলিকে সত্য হিসাবে ফ্ল্যাগ সেট করেছেন, এটি নির্দেশ করে যে আপনি পাসকিগুলির মাধ্যমে লগ ইন করছেন৷
  • একবার লগ ইন করলে, আপনি আপনার ব্যবহারকারীকে হোম স্ক্রিনে পুনঃনির্দেশিত করবেন।

নিম্নলিখিত কোড স্নিপেটে একটি উদাহরণ বিকল্প রয়েছে যা আপনি গ্রহণ করবেন:

{
  "id": String,
  "rawId": String,
  "type": "public-key",
  "response": {
    "clientDataJSON": String,
    "attestationObject": String,
  }
}

নিম্নলিখিত টেবিলটি সম্পূর্ণ নয়, তবে এতে PublicKeyCredential এ গুরুত্বপূর্ণ পরামিতি রয়েছে:

পরামিতি

বর্ণনা

id

তৈরি করা পাসকির একটি Base64URL এনকোড করা আইডি৷ এই আইডি ব্রাউজারকে প্রমাণীকরণের পরে ডিভাইসে একটি ম্যাচিং পাসকি আছে কিনা তা নির্ধারণ করতে সহায়তা করে। এই মানটি অবশ্যই ব্যাকএন্ডের ডাটাবেসে সংরক্ষণ করতে হবে।

rawId

শংসাপত্র আইডির একটি ArrayBuffer অবজেক্ট সংস্করণ।

response.clientDataJSON

একটি ArrayBuffer অবজেক্ট এনকোডেড ক্লায়েন্ট ডেটা।

response.attestationObject

একটি ArrayBuffer এনকোডেড প্রত্যয়ন বস্তু। এতে গুরুত্বপূর্ণ তথ্য রয়েছে, যেমন একটি RP ID, পতাকা এবং একটি পাবলিক কী।

অ্যাপটি চালান, এবং আপনি সাইন আপ উইথ পাসকি বোতামে ক্লিক করতে এবং একটি পাসকি তৈরি করতে সক্ষম হবেন।

4. শংসাপত্র প্রদানকারীতে পাসওয়ার্ড সংরক্ষণ করুন

এই অ্যাপে, আপনার সাইনআপ স্ক্রিনের ভিতরে, আপনি ইতিমধ্যেই প্রদর্শনের উদ্দেশ্যে প্রয়োগ করা ব্যবহারকারীর নাম এবং পাসওয়ার্ড সহ একটি সাইন আপ করেছেন৷

ব্যবহারকারীর পাসওয়ার্ড শংসাপত্র তাদের পাসওয়ার্ড প্রদানকারীর সাথে সংরক্ষণ করতে, আপনি পাসওয়ার্ড সংরক্ষণ করতে createCredential() এ পাস করার জন্য একটি CreatePasswordRequest প্রয়োগ করবেন।

  • signUpWithPassword() পদ্ধতি খুঁজুন, পাসওয়ার্ড কল তৈরি করতে TODO প্রতিস্থাপন করুন:

SignUpFragment.kt

//TODO : Save the user credential password with their password provider

createPassword()
  • createPassword() পদ্ধতির ভিতরে, আপনাকে এইরকম পাসওয়ার্ড অনুরোধ তৈরি করতে হবে, নিম্নলিখিত কোড দিয়ে TODO প্রতিস্থাপন করুন:

SignUpFragment.kt

//TODO : CreatePasswordRequest with entered username and password

val request = CreatePasswordRequest(
   binding.username.text.toString(),
   binding.password.text.toString()
)
  • এরপর, createPassword() পদ্ধতির ভিতরে, আপনাকে পাসওয়ার্ডের অনুরোধ তৈরি করে শংসাপত্র তৈরি করতে হবে এবং ব্যবহারকারীর পাসওয়ার্ড শংসাপত্র তাদের পাসওয়ার্ড প্রদানকারীর সাথে সংরক্ষণ করতে হবে, নিম্নলিখিত কোড দিয়ে TODO প্রতিস্থাপন করুন:

SignUpFragment.kt

//TODO : Create credential with created password request


try {
   credentialManager.createCredential(request, requireActivity()) as CreatePasswordResponse
} catch (e: Exception) {
   Log.e("Auth", " Exception Message : " + e.message)
}
  • এখন আপনি শুধুমাত্র এক-ট্যাপে পাসওয়ার্ডের মাধ্যমে প্রমাণীকরণের জন্য ব্যবহারকারীর পাসওয়ার্ড প্রদানকারীর সাথে পাসওয়ার্ড শংসাপত্রটি সফলভাবে সংরক্ষণ করেছেন।

5. একটি পাসকি বা পাসওয়ার্ড দিয়ে প্রমাণীকরণ করার ক্ষমতা যোগ করুন

এখন আপনি এটিকে আপনার অ্যাপে নিরাপদে প্রমাণীকরণের উপায় হিসেবে ব্যবহার করতে প্রস্তুত৷

629001f4a778d4fb.png

GetPasskey() কলে পাস করার জন্য চ্যালেঞ্জ এবং অন্যান্য বিকল্পগুলি পান

আপনি ব্যবহারকারীকে প্রমাণীকরণ করতে বলার আগে, আপনাকে একটি চ্যালেঞ্জ সহ সার্ভার থেকে WebAuthn json-এ পাস করার পরামিতিগুলির অনুরোধ করতে হবে।

আপনার কাছে ইতিমধ্যেই আপনার সম্পদে ( AuthFromServer.txt ) একটি উপহাস প্রতিক্রিয়া রয়েছে যা এই কোডল্যাবে এই ধরনের পরামিতি প্রদান করে৷

  • আপনার অ্যাপে, SignInFragment.kt-এ নেভিগেট করুন, signInWithSavedCredentials পদ্ধতি খুঁজুন যেখানে আপনি সংরক্ষিত পাসকি বা পাসওয়ার্ডের মাধ্যমে প্রমাণীকরণের জন্য যুক্তি লিখবেন এবং ব্যবহারকারীকে অনুমতি দেবেন:
  • createPasskey() কল করার জন্য একটি মন্তব্য সহ অন্য ব্লক চেক করুন এবং নিম্নলিখিত কোড দিয়ে প্রতিস্থাপন করুন:

SignInFragment.kt

//TODO : Call getSavedCredentials() method to signin using passkey/password

val data = getSavedCredentials()
  • getSavedCredentials() পদ্ধতির ভিতরে, আপনাকে আপনার শংসাপত্র প্রদানকারীর কাছ থেকে শংসাপত্রগুলি পেতে প্রয়োজনীয় প্যারামিটার সহ একটি GetPublicKeyCredentialOption () তৈরি করতে হবে।

SigninFragment.kt

//TODO create a GetPublicKeyCredentialOption() with necessary registration json from server

val getPublicKeyCredentialOption =
   GetPublicKeyCredentialOption(fetchAuthJsonFromServer(), null)

এই fetchAuthJsonFromServer() একটি পদ্ধতি, যা সম্পদ থেকে প্রমাণীকরণ json প্রতিক্রিয়া পড়ে এবং এই ব্যবহারকারী অ্যাকাউন্টের সাথে যুক্ত সমস্ত পাসকি পুনরুদ্ধার করতে প্রমাণীকরণ json ফেরত দেয়।

2য় প্যারামিটার : clientDataHash - একটি হ্যাশ যা নির্ভরকারী পক্ষের পরিচয় যাচাই করতে ব্যবহৃত হয়, শুধুমাত্র যদি আপনি GetCredentialRequest.origin সেট করে থাকেন। নমুনা অ্যাপের জন্য, এটি শূন্য।

3য় প্যারামিটারটি সত্য যদি আপনি দূরবর্তী শংসাপত্রগুলি আবিষ্কার করতে ফিরে যাওয়ার পরিবর্তে কোনও উপলব্ধ শংসাপত্র না থাকলে অবিলম্বে অপারেশনটি ফিরে যেতে পছন্দ করেন এবং অন্যথায় মিথ্যা (ডিফল্ট)।

  • fetchAuthJsonFromServer() পদ্ধতি খুঁজুন এবং json রিটার্ন করতে নিম্নলিখিত কোড দিয়ে TODO প্রতিস্থাপন করুন এবং খালি স্ট্রিং রিটার্ন স্টেটমেন্টও সরিয়ে দিন :

SignInFragment.kt

//TODO fetch authentication mock json

return requireContext().readFromAsset("AuthFromServer")

দ্রষ্টব্য: এই কোডল্যাবের সার্ভারটি এমন একটি JSON ফেরত দেওয়ার জন্য ডিজাইন করা হয়েছে যা API-এর getCredential() কলে পাস করা PublicKeyCredentialRequestOptions অভিধানের সাথে যতটা সম্ভব অনুরূপ। নিম্নলিখিত কোড স্নিপেটে কয়েকটি উদাহরণের বিকল্প রয়েছে যা আপনার গ্রহণ করা উচিত:

{
  "challenge": String,
  "rpId": String,
  "userVerification": "",
  "timeout": 1800000
}

নিম্নলিখিত সারণীটি সম্পূর্ণ নয়, তবে এতে PublicKeyCredentialRequestOptions অভিধানে গুরুত্বপূর্ণ প্যারামিটার রয়েছে:

পরামিতি

বর্ণনা

challenge

একটি ArrayBuffer অবজেক্টে একটি সার্ভার-উত্পন্ন চ্যালেঞ্জ। রিপ্লে আক্রমণ প্রতিরোধ করার জন্য এটি প্রয়োজনীয়। দুবার প্রতিক্রিয়ায় একই চ্যালেঞ্জ গ্রহণ করবেন না। এটিকে একটি CSRF টোকেন বিবেচনা করুন।

rpId

একটি RP ID হল একটি ডোমেইন। একটি ওয়েবসাইট তার ডোমেন বা একটি নিবন্ধনযোগ্য প্রত্যয় নির্দিষ্ট করতে পারে। এই মানটি অবশ্যই পাসকি তৈরি করার সময় ব্যবহৃত rp.id প্যারামিটারের সাথে মেলে।

  • পরবর্তীতে আপনাকে এই ব্যবহারকারীর অ্যাকাউন্টের জন্য শংসাপত্র পরিচালক API এর মাধ্যমে আপনার পাসওয়ার্ড প্রদানকারীতে সংরক্ষিত সমস্ত পাসওয়ার্ড পুনরুদ্ধার করতে একটি PasswordOption() অবজেক্ট তৈরি করতে হবে। getSavedCredentials() পদ্ধতির ভিতরে, TODO খুঁজুন এবং নিম্নলিখিতটি দিয়ে প্রতিস্থাপন করুন:

SigninFragment.kt

//TODO create a PasswordOption to retrieve all the associated user's password

val getPasswordOption = GetPasswordOption()

শংসাপত্র পান

  • পরবর্তীতে আপনাকে সংশ্লিষ্ট শংসাপত্রগুলি পুনরুদ্ধার করতে উপরের সমস্ত বিকল্পগুলির সাথে getCredential() অনুরোধে কল করতে হবে:

SignInFragment.kt

//TODO call getCredential() with required credential options

val result = try {
   credentialManager.getCredential(
       requireActivity(),
       GetCredentialRequest(
           listOf(
               getPublicKeyCredentialOption,
               getPasswordOption
           )  
     )
   )
} catch (e: Exception) {
   configureViews(View.INVISIBLE, true)
   Log.e("Auth", "getCredential failed with exception: " + e.message.toString())
   activity?.showErrorAlert(
       "An error occurred while authenticating through saved credentials. Check logs for additional details"
   )
   return null
}

if (result.credential is PublicKeyCredential) {
   val cred = result.credential as PublicKeyCredential
   DataProvider.setSignedInThroughPasskeys(true)
   return "Passkey: ${cred.authenticationResponseJson}"
}
if (result.credential is PasswordCredential) {
   val cred = result.credential as PasswordCredential
   DataProvider.setSignedInThroughPasskeys(false)
   return "Got Password - User:${cred.id} Password: ${cred.password}"
}
if (result.credential is CustomCredential) {
   //If you are also using any external sign-in libraries, parse them here with the utility functions provided.
}

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

এখানে, আমরা একটি মক সার্ভার ব্যবহার করেছি, তাই আমরা শুধু সত্য ফেরত দিয়েছি যে সার্ভার সর্বজনীন কী যাচাই করেছে।

signInWithSavedCredentials () পদ্ধতির ভিতরে, প্রাসঙ্গিক মন্তব্য খুঁজুন এবং নিম্নলিখিত কোড দিয়ে প্রতিস্থাপন করুন:

SignInFragment.kt

//TODO : complete the authentication process after validating the public key credential to your server and let the user in.

data?.let {
   sendSignInResponseToServer()
   listener.showHome()
}
  • sendSigninResponseToServer() সত্য ইঙ্গিত দেয় (মক) সার্ভার ভবিষ্যতে ব্যবহারের জন্য সর্বজনীন কী যাচাই করেছে।
  • একবার লগ ইন করলে, আপনি আপনার ব্যবহারকারীকে হোম স্ক্রিনে পুনঃনির্দেশিত করবেন।

নিম্নলিখিত কোড স্নিপেটে একটি উদাহরণ PublicKeyCredential অবজেক্ট রয়েছে:

{
  "id": String
  "rawId": String
  "type": "public-key",
  "response": {
    "clientDataJSON": String
    "authenticatorData": String
    "signature": String
    "userHandle": String
  }
}

নিম্নলিখিত টেবিলটি সম্পূর্ণ নয়, তবে এতে PublicKeyCredential অবজেক্টের গুরুত্বপূর্ণ প্যারামিটার রয়েছে:

পরামিতি

বর্ণনা

id

প্রমাণীকৃত পাসকি শংসাপত্রের Base64URL এনকোড করা ID।

rawId

শংসাপত্র আইডির একটি ArrayBuffer অবজেক্ট সংস্করণ।

response.clientDataJSON

ক্লায়েন্ট ডেটার একটি ArrayBuffer অবজেক্ট। এই ক্ষেত্রটিতে তথ্য রয়েছে, যেমন চ্যালেঞ্জ এবং উৎপত্তি যা RP সার্ভারকে যাচাই করতে হবে।

response.authenticatorData

প্রমাণীকরণকারী ডেটার একটি ArrayBuffer অবজেক্ট। এই ক্ষেত্রটিতে RP ID এর মত তথ্য রয়েছে।

response.signature

স্বাক্ষরের একটি ArrayBuffer অবজেক্ট। এই মান হল শংসাপত্রের মূল এবং সার্ভারে যাচাই করা আবশ্যক৷

response.userHandle

একটি ArrayBuffer অবজেক্ট যাতে ব্যবহারকারী আইডি তৈরির সময় সেট করা থাকে। এই মানটি ক্রেডেনশিয়াল আইডির পরিবর্তে ব্যবহার করা যেতে পারে যদি সার্ভারটিকে আইডি মানগুলি বাছাই করতে হয় যা এটি ব্যবহার করে, অথবা যদি ব্যাকএন্ড ক্রেডেনশিয়াল আইডিগুলিতে একটি সূচক তৈরি করা এড়াতে চায়৷

অ্যাপটি চালান, সাইন ইন করতে নেভিগেট করুন -> পাসকি/সংরক্ষিত পাসওয়ার্ড দিয়ে সাইন ইন করুন এবং সংরক্ষিত শংসাপত্র ব্যবহার করে সাইন ইন করার চেষ্টা করুন।

চেষ্টা করে দেখুন

আপনি আপনার অ্যান্ড্রয়েড অ্যাপে ক্রেডেনশিয়াল ম্যানেজার API ব্যবহার করে পাসকি তৈরি, ক্রেডেনশিয়াল ম্যানেজারে পাসওয়ার্ড সংরক্ষণ এবং পাসকি বা পাসওয়ার্ড সংরক্ষণের মাধ্যমে প্রমাণীকরণ বাস্তবায়ন করেছেন।

6. অভিনন্দন!

আপনি এই কোডল্যাব শেষ! আপনি যদি চূড়ান্ত রেজোলিউশন পরীক্ষা করতে চান তবে এটি https://github.com/android/identity-samples/tree/main/CredentialManager- এ উপলব্ধ

আপনার যদি কোনো প্রশ্ন থাকে, একটি passkey ট্যাগ দিয়ে StackOverflow- এ তাদের জিজ্ঞাসা করুন।

আরও জানুন