ক্রেডেনশিয়াল ম্যানেজার দিয়ে আপনার ব্যবহারকারীকে সাইন ইন করুন

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

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

এই পৃষ্ঠায় পাসকির ধারণা এবং ক্রেডেনশিয়াল ম্যানেজার API ব্যবহার করে পাসকি সহ প্রমাণীকরণ সমাধানের জন্য ক্লায়েন্ট-সাইড সহায়তা বাস্তবায়নের পদক্ষেপগুলি ব্যাখ্যা করা হয়েছে। এছাড়াও একটি পৃথক FAQ পৃষ্ঠা রয়েছে যা আরও বিস্তারিত, নির্দিষ্ট প্রশ্নের উত্তর প্রদান করে।

পাসকি সম্পর্কে

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

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

ক্রেডেনশিয়াল ম্যানেজার ব্যবহারকারীদের পাসকি তৈরি করতে এবং গুগল পাসওয়ার্ড ম্যানেজারে সংরক্ষণ করতে দেয়।

ক্রেডেনশিয়াল ম্যানেজারের সাহায্যে কীভাবে নিরবচ্ছিন্ন পাসকি প্রমাণীকরণ প্রবাহ বাস্তবায়ন করতে হয় তার নির্দেশনার জন্য পাসকি সহ ব্যবহারকারী প্রমাণীকরণ পড়ুন।

পূর্বশর্ত

ক্রেডেনশিয়াল ম্যানেজার ব্যবহার করতে, এই বিভাগের ধাপগুলি সম্পূর্ণ করুন।

একটি সাম্প্রতিক প্ল্যাটফর্ম সংস্করণ ব্যবহার করুন

ক্রেডেনশিয়াল ম্যানেজার অ্যান্ড্রয়েড ৪.৪ (এপিআই লেভেল ১৯) এবং তার উচ্চতর সংস্করণে সমর্থিত।

আপনার অ্যাপে নির্ভরতা যোগ করুন

ক্রেডেনশিয়াল ম্যানেজার লাইব্রেরির সর্বশেষ সংস্করণ ব্যবহার করতে, আপনার অ্যাপ মডিউলের বিল্ড স্ক্রিপ্টে নিম্নলিখিত নির্ভরতাগুলি যোগ করুন:

কোটলিন

dependencies {
    implementation("androidx.credentials:credentials:1.6.0-beta03")
    implementation("androidx.credentials:credentials-play-services-auth:1.6.0-beta03")
}

গ্রোভি

dependencies {
    implementation "androidx.credentials:credentials:1.6.0-beta03"
    implementation "androidx.credentials:credentials-play-services-auth:1.6.0-beta03"
}

আপনার অ্যাপটি কীভাবে সঙ্কুচিত, অস্পষ্ট এবং অপ্টিমাইজ করবেন সে সম্পর্কে আরও জানুন।

ডিজিটাল সম্পদ লিঙ্কগুলির জন্য সমর্থন যোগ করুন

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

  1. একটি ডিজিটাল অ্যাসেট লিঙ্ক JSON ফাইল তৈরি করুন। উদাহরণস্বরূপ, https://signin.example.com ওয়েবসাইট এবং com.example প্যাকেজ নামের একটি অ্যান্ড্রয়েড অ্যাপ সাইন-ইন ক্রেডেনশিয়াল শেয়ার করতে পারে তা ঘোষণা করতে, নিম্নলিখিত কন্টেন্ট সহ assetlinks.json নামে একটি ফাইল তৈরি করুন:

    [
      {
        "relation" : [
          "delegate_permission/common.handle_all_urls",
          "delegate_permission/common.get_login_creds"
        ],
        "target" : {
          "namespace" : "android_app",
          "package_name" : "com.example.android",
          "sha256_cert_fingerprints" : [
            SHA_HEX_VALUE
          ]
        }
      }
    ]
    

    relation ক্ষেত্র হল এক বা একাধিক স্ট্রিংয়ের একটি অ্যারে যা ঘোষণা করা সম্পর্ক বর্ণনা করে। অ্যাপ এবং সাইটগুলি সাইন-ইন শংসাপত্র ভাগ করে নেওয়ার ঘোষণা দিতে, সম্পর্কগুলিকে delegate_permission/handle_all_urls এবং delegate_permission/common.get_login_creds হিসাবে উল্লেখ করুন।

    target ক্ষেত্র হল এমন একটি বস্তু যা ঘোষণাটি কোন সম্পদের জন্য প্রযোজ্য তা নির্দিষ্ট করে। নিম্নলিখিত ক্ষেত্রগুলি একটি ওয়েবসাইটকে চিহ্নিত করে:

    namespace web
    site

    ওয়েবসাইটের URL, https:// domain [: optional_port ] ফর্ম্যাটে; উদাহরণস্বরূপ, https://www.example.com

    domain সম্পূর্ণরূপে যোগ্যতাসম্পন্ন হতে হবে।, এবং HTTPS এর জন্য পোর্ট 443 ব্যবহার করার সময় optional_port বাদ দিতে হবে।

    একটি site টার্গেট শুধুমাত্র একটি রুট ডোমেন হতে পারে: আপনি একটি অ্যাপ অ্যাসোসিয়েশনকে একটি নির্দিষ্ট সাবডিরেক্টরিতে সীমাবদ্ধ করতে পারবেন না। URL-এ কোনও পাথ অন্তর্ভুক্ত করবেন না, যেমন একটি ট্রেলিং স্ল্যাশ।

    সাবডোমেনগুলি মিলছে বলে বিবেচিত হবে না: অর্থাৎ, যদি আপনি domain www.example.com হিসাবে নির্দিষ্ট করেন, তাহলে www.counter.example.com ডোমেনটি আপনার অ্যাপের সাথে সম্পর্কিত হবে না।

    নিম্নলিখিত ক্ষেত্রগুলি একটি অ্যান্ড্রয়েড অ্যাপকে শনাক্ত করে:

    namespace android_app
    package_name অ্যাপের ম্যানিফেস্টে ঘোষিত প্যাকেজের নাম। উদাহরণস্বরূপ, com.example.android
    sha256_cert_fingerprints আপনার অ্যাপের স্বাক্ষর শংসাপত্রের SHA256 আঙুলের ছাপ।
  2. সাইন-ইন ডোমেনের নিম্নলিখিত স্থানে ডিজিটাল অ্যাসেট লিঙ্ক JSON ফাইলটি হোস্ট করুন:

    https://domain[:optional_port]/.well-known/assetlinks.json
    

    উদাহরণস্বরূপ, যদি আপনার সাইন-ইন ডোমেন signin.example.com হয়, তাহলে https://signin.example.com/.well-known/assetlinks.json এ JSON ফাইলটি হোস্ট করুন।

    ডিজিটাল অ্যাসেটস লিংক ফাইলের জন্য MIME টাইপ অবশ্যই JSON হতে হবে। যাচাই করুন যে সার্ভার প্রতিক্রিয়ায় একটি Content-Type: application/json হেডার পাঠাচ্ছে।

  3. আপনার হোস্ট Google কে আপনার ডিজিটাল অ্যাসেট লিঙ্ক ফাইলটি পুনরুদ্ধার করার অনুমতি দিয়েছে কিনা তা যাচাই করুন। যদি আপনার একটি robots.txt ফাইল থাকে, তাহলে এটি Googlebot এজেন্টকে /.well-known/assetlinks.json পুনরুদ্ধার করার অনুমতি দিতে হবে। বেশিরভাগ সাইট যেকোনো স্বয়ংক্রিয় এজেন্টকে /.well-known/ পাথে ফাইলগুলি পুনরুদ্ধার করার অনুমতি দিতে পারে যাতে অন্যান্য পরিষেবাগুলি সেই ফাইলগুলির মেটাডেটা অ্যাক্সেস করতে পারে:

    User-agent: *
    Allow: /.well-known/
    
  4. <application> এর অধীনে ম্যানিফেস্ট ফাইলে নিম্নলিখিত লাইনটি যোগ করুন:

    <meta-data android:name="asset_statements" android:resource="@string/asset_statements" />
    
  5. যদি আপনি ক্রেডেনশিয়াল ম্যানেজারের মাধ্যমে পাসওয়ার্ড সাইন-ইন ব্যবহার করেন, তাহলে ম্যানিফেস্টে ডিজিটাল অ্যাসেট লিঙ্কিং কনফিগার করতে এই ধাপটি অনুসরণ করুন। যদি আপনি শুধুমাত্র পাসকি ব্যবহার করেন তবে এই ধাপটি প্রয়োজন হবে না।

    অ্যান্ড্রয়েড অ্যাপে অ্যাসোসিয়েশন ঘোষণা করুন। লোড করার জন্য assetlinks.json ফাইলগুলি নির্দিষ্ট করে এমন একটি অবজেক্ট যোগ করুন। স্ট্রিংয়ে ব্যবহার করা যেকোনো অ্যাপোস্ট্রোফি এবং উদ্ধৃতি চিহ্ন এড়িয়ে যেতে হবে। উদাহরণস্বরূপ:

    <string name="asset_statements" translatable="false">
    [{
      \"include\": \"https://signin.example.com/.well-known/assetlinks.json\"
    }]
    </string>
    
    > GET /.well-known/assetlinks.json HTTP/1.1
    > User-Agent: curl/7.35.0
    > Host: signin.example.com
    
    < HTTP/1.1 200 OK
    < Content-Type: application/json
    

ক্রেডেনশিয়াল ম্যানেজার কনফিগার করুন

একটি CredentialManager অবজেক্ট কনফিগার এবং ইনিশিয়ালাইজ করতে, নিম্নলিখিতগুলির মতো লজিক যোগ করুন:

// Use your app or activity context to instantiate a client instance of
// CredentialManager.
private val credentialManager = CredentialManager.create(context)

শংসাপত্রের ক্ষেত্রগুলি নির্দেশ করুন

অ্যান্ড্রয়েড ১৪ এবং তার পরবর্তী সংস্করণে, isCredential অ্যাট্রিবিউটটি ব্যবহারকারীর নাম বা পাসওয়ার্ড ক্ষেত্রগুলির মতো ক্রেডেনশিয়াল ক্ষেত্রগুলি নির্দেশ করতে ব্যবহার করা যেতে পারে। এই অ্যাট্রিবিউটটি নির্দেশ করে যে এই ভিউটি একটি ক্রেডেনশিয়াল ক্ষেত্র যা ক্রেডেনশিয়াল ম্যানেজার এবং তৃতীয় পক্ষের ক্রেডেনশিয়াল প্রদানকারীদের সাথে কাজ করার উদ্দেশ্যে তৈরি করা হয়েছে, একই সাথে অটোফিল পরিষেবাগুলিকে আরও ভাল অটোফিল পরামর্শ প্রদান করতে সহায়তা করে। যখন অ্যাপটি ক্রেডেনশিয়াল ম্যানেজার API ব্যবহার করে, তখন উপলব্ধ ক্রেডেনশিয়াল সহ ক্রেডেনশিয়াল ম্যানেজারের নীচের শীটটি প্রদর্শিত হয় এবং ব্যবহারকারীর নাম বা পাসওয়ার্ডের জন্য অটোফিলের ফিল ডায়ালগ দেখানোর আর কোনও প্রয়োজন হয় না। একইভাবে, পাসওয়ার্ডের জন্য অটোফিলের সেভ ডায়ালগ দেখানোর কোনও প্রয়োজন নেই, কারণ অ্যাপটি ক্রেডেনশিয়াল সংরক্ষণ করার জন্য ক্রেডেনশিয়াল ম্যানেজার API-এর অনুরোধ করবে।

isCredential অ্যাট্রিবিউট ব্যবহার করতে, এটি প্রাসঙ্গিক ভিউতে যোগ করুন:

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:isCredential="true" />

আপনার ব্যবহারকারীকে সাইন ইন করুন

ব্যবহারকারীর অ্যাকাউন্টের সাথে সম্পর্কিত সমস্ত পাসকি এবং পাসওয়ার্ড বিকল্পগুলি পুনরুদ্ধার করতে, এই পদক্ষেপগুলি সম্পূর্ণ করুন:

  1. পাসওয়ার্ড এবং পাসকি প্রমাণীকরণ বিকল্পগুলি শুরু করুন:

    // Get password logins from the credential provider on the user's device.
    val getPasswordOption = GetPasswordOption()
    
    // Get passkeys from the credential provider on the user's device.
    val getPublicKeyCredentialOption = GetPublicKeyCredentialOption(
        requestJson = requestJson
    )
          
  2. সাইন-ইন অনুরোধ তৈরি করতে পূর্ববর্তী ধাপ থেকে প্রাপ্ত বিকল্পগুলি ব্যবহার করুন।

    val credentialRequest = GetCredentialRequest(
        // Include all the sign-in options that your app supports.
        listOf(getPasswordOption, getPublicKeyCredentialOption),
        // Defines whether you prefer to use only immediately available
        // credentials or hybrid credentials.
        preferImmediatelyAvailableCredentials = preferImmediatelyAvailableCredentials
    )
          
  3. সাইন-ইন ফ্লো চালু করুন:

    coroutineScope {
        try {
            result = credentialManager.getCredential(
                // Use an activity-based context to avoid undefined system UI
                // launching behavior.
                context = activityContext,
                request = credentialRequest
            )
            handleSignIn(result)
        } catch (e: GetCredentialException) {
            // Handle failure
        }
    }
        
    fun handleSignIn(result: GetCredentialResponse) {
        // Handle the successfully returned credential.
        val credential = result.credential
    
        when (credential) {
            is PublicKeyCredential -> {
                val responseJson = credential.authenticationResponseJson
                // Share responseJson i.e. a GetCredentialResponse on your server to
                // validate and  authenticate
            }
    
            is PasswordCredential -> {
                val username = credential.id
                val password = credential.password
                // Use id and password to send to your server to validate
                // and authenticate
            }
    
            is CustomCredential -> {
                // If you are also using any external sign-in libraries, parse them
                // here with the utility functions provided.
                if (credential.type == ExampleCustomCredential.TYPE) {
                    try {
                        val ExampleCustomCredential =
                            ExampleCustomCredential.createFrom(credential.data)
                        // Extract the required credentials and complete the authentication as per
                        // the federated sign in or any external sign in library flow
                    } catch (e: ExampleCustomCredential.ExampleCustomCredentialParsingException) {
                        // Unlikely to happen. If it does, you likely need to update the dependency
                        // version of your external sign-in library.
                        Log.e(TAG, "Failed to parse an ExampleCustomCredential", e)
                    }
                } else {
                    // Catch any unrecognized custom credential type here.
                    Log.e(TAG, "Unexpected type of credential")
                }
            }
            else -> {
                // Catch any unrecognized credential type here.
                Log.e(TAG, "Unexpected type of credential")
            }
        }
    }
        

নিম্নলিখিত উদাহরণে দেখানো হয়েছে কিভাবে পাসকি পেলে JSON অনুরোধটি ফর্ম্যাট করতে হয়:

{
  "challenge": "T1xCsnxM2DNL2KdK5CLa6fMhD7OBqho6syzInk_n-Uo",
  "allowCredentials": [],
  "timeout": 1800000,
  "userVerification": "required",
  "rpId": "https://passkeys-codelab.glitch.me/"
}

নিম্নলিখিত উদাহরণটি দেখায় যে আপনি একটি পাবলিক কী শংসাপত্র পাওয়ার পরে একটি JSON প্রতিক্রিয়া কেমন দেখাতে পারে:

{
  "id": "<credential ID>",
  "type": "public-key",
  "rawId": "<raw credential ID>",
  "response": {
    "clientDataJSON": "<signed client data containing challenge>",
    "authenticatorData": "<authenticator metadata>",
    "signature": "<digital signature to be verified>",
    "userHandle": "<user ID from credential registration>"
  }
}

কোনও শংসাপত্র উপলব্ধ না থাকলে ব্যতিক্রমগুলি পরিচালনা করুন

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

coroutineScope {
    try {
        result = credentialManager.getCredential(
            context = activityContext,
            request = credentialRequest
        )
    } catch (e: GetCredentialException) {
        Log.e("CredentialManager", "No credential available", e)
    }
}

অ্যান্ড্রয়েড ১৪ বা তার পরবর্তী ভার্সনে, getCredential() কল করার আগে prepareGetCredential() পদ্ধতি ব্যবহার করে অ্যাকাউন্ট নির্বাচক দেখানোর সময় লেটেন্সি কমাতে পারেন।

coroutineScope {
    val response = credentialManager.prepareGetCredential(
        GetCredentialRequest(
            listOf(
                // Include all the sign-in options that your app supports
                getPublicKeyCredentialOption, 
                getPasswordOption
            )
        )
    )
}

prepareGetCredential() পদ্ধতিটি UI উপাদানগুলিকে আহ্বান করে না। এটি আপনাকে শুধুমাত্র প্রস্তুতির কাজ সম্পাদন করতে সাহায্য করে যাতে আপনি পরে getCredential() API এর মাধ্যমে অবশিষ্ট get-credential অপারেশন (যার মধ্যে UI গুলি অন্তর্ভুক্ত) চালু করতে পারেন।

ক্যাশ করা ডেটা একটি PrepareGetCredentialResponse অবজেক্টে ফেরত পাঠানো হয়। যদি বিদ্যমান ক্রেডেনশিয়াল থাকে, তাহলে ফলাফলগুলি ক্যাশ করা হবে এবং আপনি পরে অবশিষ্ট getCredential() API চালু করে ক্যাশ করা ডেটা সহ অ্যাকাউন্ট নির্বাচক আনতে পারেন।

নিবন্ধন প্রবাহ

আপনি পাসকি অথবা পাসওয়ার্ড ব্যবহার করে প্রমাণীকরণের জন্য একজন ব্যবহারকারীকে নিবন্ধন করতে পারেন।

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

ব্যবহারকারীদের একটি পাসকি নথিভুক্ত করার এবং পুনঃপ্রমাণীকরণের জন্য এটি ব্যবহার করার বিকল্প দেওয়ার জন্য, একটি CreatePublicKeyCredentialRequest অবজেক্ট ব্যবহার করে একটি ব্যবহারকারীর শংসাপত্র নিবন্ধন করুন।

suspend fun createPasskey(requestJson: String, preferImmediatelyAvailableCredentials: Boolean) {
    var isConditional: Boolean = false
    val createPublicKeyCredentialRequest = CreatePublicKeyCredentialRequest(
        // Contains the request in JSON format.
        requestJson = requestJson,
        // Defines whether you prefer to use only locally-available
        // credentials or hybrid credentials.
        preferImmediatelyAvailableCredentials = preferImmediatelyAvailableCredentials,
        // Automatically create a passkey if the user does not have one.
        isConditional = isConditional
    )

    // Execute createCredential asynchronously to register credentials
    // for a user account.
    coroutineScope {
        try {
            val result = credentialManager.createCredential(
                // Use an activity-based context to avoid undefined system
                // UI launching behavior
                context = activityContext,
                request = createPublicKeyCredentialRequest,
            )
            //  Handle passkey creation result
        } catch (e: CreateCredentialException) {
            handleFailure(e)
        }
    }
}
fun handleFailure(e: CreateCredentialException) {
    when (e) {
        is CreatePublicKeyCredentialDomException -> {
            // Handle the passkey DOM errors thrown according to the
            // WebAuthn spec.
        }
        is CreateCredentialCancellationException -> {
            // The user intentionally canceled the operation and chose not
            // to register the credential.
        }
        is CreateCredentialInterruptedException -> {
            // Retry-able error. Consider retrying the call.
        }
        is CreateCredentialProviderConfigurationException -> {
            // Your app is missing the provider configuration dependency.
            // Most likely, you're missing the
            // "credentials-play-services-auth" module.
        }
        is CreateCredentialCustomException -> {
            // You have encountered an error from a 3rd-party SDK. If you
            // make the API call with a request object that's a subclass of
            // CreateCustomCredentialRequest using a 3rd-party SDK, then you
            // should check for any custom exception type constants within
            // that SDK to match with e.type. Otherwise, drop or log the
            // exception.
        }
        else -> Log.w(TAG, "Unexpected exception type ${e::class.java.name}")
    }
}

JSON অনুরোধটি ফর্ম্যাট করুন

একটি পাসকি তৈরি করার পরে, আপনাকে এটি একটি ব্যবহারকারীর অ্যাকাউন্টের সাথে সংযুক্ত করতে হবে এবং আপনার সার্ভারে পাসকির পাবলিক কী সংরক্ষণ করতে হবে। নিম্নলিখিত কোড উদাহরণটি দেখায় যে আপনি যখন একটি পাসকি তৈরি করেন তখন JSON অনুরোধটি কীভাবে ফর্ম্যাট করবেন।

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

{
  "challenge": "<base64url-encoded challenge>",
  "rp": {
    "name": "<relying party name>",
    "id": "<relying party host name>"
  },
  "user": {
    "id": "<base64url-encoded user ID>",
    "name": "<user name>",
    "displayName": "<user display name>"
  },
  "pubKeyCredParams": [
    {
      "type": "public-key",
      "alg": -7
    }
  ],
  "attestation": "none",
  "excludeCredentials": [
    {
        "id": "<base64url-encoded credential ID to exclude>", 
        "type": "public-key"
    }
  ],
  "authenticatorSelection": {
    "requireResidentKey": true,
    "residentKey": "required",
    "userVerification": "required"
  }
}

authenticatorAttachment-এর জন্য মান সেট করুন

authenticatorAttachment প্যারামিটার শুধুমাত্র ক্রেডেনশিয়াল তৈরির সময় সেট করা যেতে পারে। আপনি platform , cross-platform , অথবা কোন মান উল্লেখ করতে পারেন না। বেশিরভাগ ক্ষেত্রে, কোন মান সুপারিশ করা হয় না।

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

ডুপ্লিকেট পাসকি তৈরি রোধ করুন

যদি একই পাসকি প্রদানকারীর সাথে ইতিমধ্যেই একটি নতুন পাসকি বিদ্যমান থাকে, তাহলে নতুন পাসকি তৈরি রোধ করতে ঐচ্ছিক excludeCredentials অ্যারেতে ক্রেডেনশিয়াল আইডি তালিকাভুক্ত করুন।

JSON প্রতিক্রিয়া পরিচালনা করুন

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

{
  "id": "<identifier>",
  "type": "public-key",
  "rawId": "<identifier>",
  "response": {
    "clientDataJSON": "<ArrayBuffer encoded object with the origin and signed challenge>",
    "attestationObject": "<ArrayBuffer encoded object with the public key and other information.>"
  },
  "authenticatorAttachment": "platform"
}

ক্লায়েন্ট ডেটা JSON থেকে উৎপত্তি যাচাই করুন

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

ওয়েবের ক্ষেত্রে, origin একই সাইটের অরিজিনকে প্রতিফলিত করে যেখানে ক্রেডেনশিয়াল সাইন ইন করা হয়েছিল। উদাহরণস্বরূপ, https://www.example.com:8443/store?category=shoes#athletic এর একটি URL দেওয়া হলে, origin হল https://www.example.com:8443

অ্যান্ড্রয়েড অ্যাপের ক্ষেত্রে, ব্যবহারকারী এজেন্ট স্বয়ংক্রিয়ভাবে কলিং অ্যাপের স্বাক্ষরের সাথে origin সেট করে। পাসকি API-এর কলার যাচাই করার জন্য এই স্বাক্ষরটি আপনার সার্ভারে একটি মিল হিসাবে যাচাই করা উচিত। অ্যান্ড্রয়েড origin হল APK স্বাক্ষর সার্টিফিকেটের SHA-256 হ্যাশ থেকে প্রাপ্ত একটি URI, যেমন:

android:apk-key-hash:<sha256_hash-of-apk-signing-cert>

নিম্নলিখিত টার্মিনাল কমান্ডটি চালিয়ে একটি কীস্টোর থেকে স্বাক্ষরকারী সার্টিফিকেটের SHA-256 হ্যাশগুলি পাওয়া যাবে:

keytool -list -keystore <path-to-apk-signing-keystore>

SHA-256 হ্যাশগুলি একটি কোলন-সীমাবদ্ধ হেক্সাডেসিমেল ফর্ম্যাটে ( 91:F7:CB:F9:D6:81… ), এবং অ্যান্ড্রয়েড origin মানগুলি base64url-এনকোডেড। এই পাইথন উদাহরণটি দেখায় যে কীভাবে হ্যাশ ফর্ম্যাটটিকে একটি সামঞ্জস্যপূর্ণ, কোলন-বিভাজিত হেক্সাডেসিমেল ফর্ম্যাটে রূপান্তর করা যায়:

import binascii
import base64
fingerprint = '91:F7:CB:F9:D6:81:53:1B:C7:A5:8F:B8:33:CC:A1:4D:AB:ED:E5:09:C5'
print("android:apk-key-hash:" + base64.urlsafe_b64encode(binascii.a2b_hex(fingerprint.replace(':', ''))).decode('utf8').replace('=', ''))

fingerprint মানটি আপনার নিজস্ব মান দিয়ে প্রতিস্থাপন করুন। এখানে একটি উদাহরণ ফলাফল রয়েছে:

android:apk-key-hash:kffL-daBUxvHpY-4M8yhTavt5QnFEI2LsexohxrGPYU

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

ব্যবহারকারীর পাসওয়ার্ড সংরক্ষণ করুন

যদি ব্যবহারকারী আপনার অ্যাপে একটি প্রমাণীকরণ প্রবাহের জন্য একটি ব্যবহারকারীর নাম এবং পাসওয়ার্ড প্রদান করে, তাহলে আপনি একটি ব্যবহারকারীর শংসাপত্র নিবন্ধন করতে পারেন যা ব্যবহারকারীকে প্রমাণীকরণ করতে ব্যবহার করা যেতে পারে। এটি করার জন্য, একটি CreatePasswordRequest অবজেক্ট তৈরি করুন:

suspend fun registerPassword(username: String, password: String) {
    // Initialize a CreatePasswordRequest object.
    val createPasswordRequest =
        CreatePasswordRequest(id = username, password = password)

    // Create credential and handle result.
    coroutineScope {
        try {
            val result =
                credentialManager.createCredential(
                    // Use an activity based context to avoid undefined
                    // system UI launching behavior.
                    activityContext,
                    createPasswordRequest
                )
            // Handle register password result
        } catch (e: CreateCredentialException) {
            handleFailure(e)
        }
    }
}

শংসাপত্র পুনরুদ্ধার সমর্থন করুন

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

ব্যবহারকারীদের জন্য স্বয়ংক্রিয়ভাবে পাসকি তৈরি করুন

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

CreatePublicKeyCredentialRequest(
    // other parameters
    isConditionalCreateRequest: Boolean = true
)

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

এই বৈশিষ্ট্যটির জন্য 1.6.0-alpha01 বা তার উচ্চতর সংস্করণ প্রয়োজন।

পাসকি এন্ডপয়েন্ট, সুপরিচিত URL সহ পাসওয়ার্ড পরিচালনার সরঞ্জামগুলির জন্য সমর্থন যোগ করুন

পাসওয়ার্ড এবং শংসাপত্র পরিচালনার সরঞ্জামগুলির সাথে নিরবচ্ছিন্ন একীকরণ এবং ভবিষ্যতের সামঞ্জস্যের জন্য, আমরা পাসকি এন্ডপয়েন্ট এবং সুপরিচিত URL গুলির জন্য সমর্থন যোগ করার পরামর্শ দিচ্ছি। এটি সংযুক্ত পক্ষগুলির জন্য একটি উন্মুক্ত প্রোটোকল যা আনুষ্ঠানিকভাবে পাসকিগুলির জন্য তাদের সমর্থনের বিজ্ঞাপন দেয় এবং পাসকি তালিকাভুক্তি এবং পরিচালনার জন্য সরাসরি লিঙ্ক সরবরাহ করে।

  1. https://example.com এ নির্ভরশীল পক্ষের জন্য, যাদের একটি ওয়েবসাইট এবং অ্যান্ড্রয়েড এবং iOS অ্যাপ রয়েছে, সুপরিচিত URL হবে https://example.com/.well-known/passkey-endpoints
  2. যখন URL টি জিজ্ঞাসা করা হয়, তখন প্রতিক্রিয়াটি নিম্নলিখিত স্কিমা ব্যবহার করা উচিত

    {
      "enroll": "https://example.com/account/manage/passkeys/create"
      "manage": "https://example.com/account/manage/passkeys"
    }
    
  3. এই লিঙ্কটি ওয়েবের পরিবর্তে সরাসরি আপনার অ্যাপে খোলার জন্য, Android অ্যাপ লিঙ্ক ব্যবহার করুন।

  4. আরও বিস্তারিত তথ্য GitHub-এর সুপরিচিত URL ব্যাখ্যাকারী পাসকি এন্ডপয়েন্টে পাওয়া যাবে।

কোন সরবরাহকারী পাসকি তৈরি করেছেন তা দেখিয়ে ব্যবহারকারীদের তাদের পাসকি পরিচালনা করতে সহায়তা করুন।

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

উদাহরণস্বরূপ, যদি কোনও ব্যবহারকারী গুগল পাসওয়ার্ড ম্যানেজার ব্যবহার করে অ্যান্ড্রয়েড-চালিত ডিভাইসে একটি পাসকি তৈরি করে, তাহলে RP তখন একটি AAGUID পায় যা দেখতে এরকম কিছু: "ea9b8d66-4d01-1d21-3ce4-b6b48cb575d4"। নির্ভরকারী পক্ষ পাসকি তালিকায় পাসকিটি টীকা করে বোঝাতে পারে যে এটি গুগল পাসওয়ার্ড ম্যানেজার ব্যবহার করে তৈরি করা হয়েছে।

একটি পাসকি প্রদানকারীর সাথে একটি AAGUID ম্যাপ করার জন্য, RP গুলি AAGUID গুলির একটি কমিউনিটি সোর্সড রিপোজিটরি ব্যবহার করতে পারে। পাসকি প্রদানকারীর নাম এবং আইকন খুঁজে পেতে তালিকায় AAGUID দেখুন।

AAGUID ইন্টিগ্রেশন সম্পর্কে আরও পড়ুন।

সাধারণ ত্রুটিগুলির সমাধান করুন

সাধারণ ত্রুটি কোড, বিবরণ এবং তাদের কারণ সম্পর্কে তথ্যের জন্য ক্রেডেনশিয়াল ম্যানেজার সমস্যা সমাধান নির্দেশিকাটি দেখুন।

অতিরিক্ত সম্পদ

ক্রেডেনশিয়াল ম্যানেজার API এবং পাসকি সম্পর্কে আরও জানতে, নিম্নলিখিত রিসোর্সগুলি দেখুন: