পাসকি , ফেডারেটেড সাইন-ইন এবং তৃতীয় পক্ষের প্রমাণীকরণ প্রদানকারীদের সমর্থন সহ, ক্রেডেনশিয়াল ম্যানেজার হল Android-এ প্রমাণীকরণের জন্য প্রস্তাবিত API যা একটি নিরাপদ এবং সুবিধাজনক পরিবেশ প্রদান করে যা ব্যবহারকারীদের তাদের শংসাপত্রগুলি সিঙ্ক এবং পরিচালনা করতে দেয়৷ স্থানীয় FIDO2 শংসাপত্র ব্যবহার করে এমন ডেভেলপারদের জন্য, ক্রেডেনশিয়াল ম্যানেজার API-এর সাথে সংহত করে পাসকি প্রমাণীকরণ সমর্থন করতে আপনার অ্যাপ আপডেট করা উচিত। এই দস্তাবেজটি বর্ণনা করে যে কীভাবে আপনার প্রকল্পকে FIDO2 থেকে শংসাপত্র ম্যানেজারে স্থানান্তর করতে হয়।
FIDO2 থেকে ক্রেডেনশিয়াল ম্যানেজারে স্থানান্তরিত করার কারণ
বেশিরভাগ ক্ষেত্রে, আপনার Android অ্যাপের প্রমাণীকরণ প্রদানকারীকে ক্রেডেনশিয়াল ম্যানেজারে স্থানান্তর করা উচিত। ক্রেডেনশিয়াল ম্যানেজারে মাইগ্রেট করার কারণগুলির মধ্যে রয়েছে:
- পাসকি সমর্থন: ক্রেডেনশিয়াল ম্যানেজার পাসকি সমর্থন করে, একটি নতুন, পাসওয়ার্ডহীন প্রমাণীকরণ প্রক্রিয়া যা পাসওয়ার্ডের চেয়ে আরও নিরাপদ এবং ব্যবহার করা সহজ।
- একাধিক সাইন-ইন পদ্ধতি: ক্রেডেনশিয়াল ম্যানেজার পাসওয়ার্ড, পাসকি এবং ফেডারেটেড সাইন-ইন পদ্ধতি সহ একাধিক সাইন-ইন পদ্ধতি সমর্থন করে। এটি ব্যবহারকারীদের পছন্দের প্রমাণীকরণ পদ্ধতি নির্বিশেষে আপনার অ্যাপে প্রমাণীকরণ করা সহজ করে তোলে।
- তৃতীয় পক্ষের শংসাপত্র প্রদানকারী সমর্থন: Android 14 এবং উচ্চতর সংস্করণে, ক্রেডেনশিয়াল ম্যানেজার একাধিক তৃতীয় পক্ষের শংসাপত্র প্রদানকারীকে সমর্থন করে। এর মানে হল আপনার ব্যবহারকারীরা আপনার অ্যাপে সাইন ইন করতে অন্যান্য প্রদানকারীদের থেকে তাদের বিদ্যমান শংসাপত্রগুলি ব্যবহার করতে পারে৷
- সামঞ্জস্যপূর্ণ ব্যবহারকারীর অভিজ্ঞতা: ক্রেডেনশিয়াল ম্যানেজার অ্যাপ এবং সাইন-ইন প্রক্রিয়া জুড়ে প্রমাণীকরণের জন্য আরও সামঞ্জস্যপূর্ণ ব্যবহারকারীর অভিজ্ঞতা প্রদান করে। এটি ব্যবহারকারীদের জন্য আপনার অ্যাপের প্রমাণীকরণ প্রবাহ বুঝতে এবং ব্যবহার করা সহজ করে তোলে।
FIDO2 থেকে ক্রেডেনশিয়াল ম্যানেজারে মাইগ্রেশন শুরু করতে, নীচের ধাপগুলি অনুসরণ করুন৷
নির্ভরতা আপডেট করুন
আপনার প্রোজেক্টের build.gradle 1.8.10 বা উচ্চতর সংস্করণে Kotlin প্লাগইন আপডেট করুন।
plugins { //… id 'org.jetbrains.kotlin.android' version '1.8.10' apply false //… }
আপনার প্রজেক্টের build.gradle-এ, ক্রেডেনশিয়াল ম্যানেজার এবং প্লে পরিষেবার প্রমাণীকরণ ব্যবহার করতে আপনার নির্ভরতা আপডেট করুন।
dependencies { // ... // Credential Manager: implementation 'androidx.credentials:credentials:<latest-version>' // Play Services Authentication: // Optional - needed for credentials support from play services, for devices running // Android 13 and below: implementation 'androidx.credentials:credentials-play-services-auth:<latest-version>' // ... }
FIDO প্রারম্ভিকতাকে ক্রেডেনশিয়াল ম্যানেজার ইনিশিয়ালাইজেশন দিয়ে প্রতিস্থাপন করুন। পাসকি তৈরি এবং সাইন ইন পদ্ধতির জন্য আপনি যে ক্লাসটি ব্যবহার করেন তাতে এই ঘোষণা যোগ করুন:
val credMan = CredentialManager.create(context)
পাসকি তৈরি করুন
ব্যবহারকারীর সাইন ইন করার আগে আপনাকে একটি নতুন পাসকি তৈরি করতে হবে, এটি একটি ব্যবহারকারীর অ্যাকাউন্টের সাথে সংযুক্ত করতে হবে এবং পাসকির সর্বজনীন কী আপনার সার্ভারে সংরক্ষণ করতে হবে৷ রেজিস্টার ফাংশন কল আপডেট করে এই ক্ষমতা দিয়ে আপনার অ্যাপ সেট আপ করুন।
পাসকি তৈরির সময়
createCredential()
পদ্ধতিতে পাঠানো প্রয়োজনীয় প্যারামিটারগুলি পেতে, আপনারregisterRequest()
সার্ভার কলেname("residentKey").value("required")
WebAuthn স্পেসিফিকেশনে বর্ণিত) যোগ করুন।suspend fun registerRequest(sessionId: String ... { // ... .method("POST", jsonRequestBody { name("attestation").value("none") name("authenticatorSelection").objectValue { name("residentKey").value("required") } }).build() // ... }
registerRequest()
এবং সমস্ত চাইল্ড ফাংশনের জন্যreturn
টাইপJSONObject
এ সেট করুন।suspend fun registerRequest(sessionId: String): ApiResult<JSONObject> { val call = client.newCall( Request.Builder() .url("$BASE_URL/<your api url>") .addHeader("Cookie", formatCookie(sessionId)) .method("POST", jsonRequestBody { name("attestation").value("none") name("authenticatorSelection").objectValue { name("authenticatorAttachment").value("platform") name("userVerification").value("required") name("residentKey").value("required") } }).build() ) val response = call.await() return response.result("Error calling the api") { parsePublicKeyCredentialCreationOptions( body ?: throw ApiException("Empty response from the api call") ) } }
আপনার দৃষ্টিভঙ্গি থেকে অভিপ্রায় লঞ্চার এবং কার্যকলাপের ফলাফল কলগুলি পরিচালনা করে এমন কোনও পদ্ধতি নিরাপদে সরিয়ে দিন।
যেহেতু
registerRequest()
এখন একটিJSONObject
ফেরত দেয়, তাই আপনাকে একটিPendingIntent
তৈরি করতে হবে না। একটিJSONObject
দিয়ে প্রত্যাবর্তিত অভিপ্রায় প্রতিস্থাপন করুন। ক্রেডেনশিয়াল ম্যানেজার API থেকেcreateCredential()
কল করতে আপনার অভিপ্রায় লঞ্চার কলগুলি আপডেট করুন৷createCredential()
API পদ্ধতিতে কল করুন।suspend fun createPasskey( activity: Activity, requestResult: JSONObject ): CreatePublicKeyCredentialResponse? { val request = CreatePublicKeyCredentialRequest(requestResult.toString()) var response: CreatePublicKeyCredentialResponse? = null try { response = credMan.createCredential( request as CreateCredentialRequest, activity ) as CreatePublicKeyCredentialResponse } catch (e: CreateCredentialException) { showErrorAlert(activity, e) return null } return response }
একবার কল সফল হলে, প্রতিক্রিয়াটি সার্ভারে ফেরত পাঠান। এই কলের অনুরোধ এবং প্রতিক্রিয়া FIDO2 বাস্তবায়নের অনুরূপ, তাই কোন পরিবর্তনের প্রয়োজন নেই।
পাসকি দিয়ে প্রমাণীকরণ করুন
আপনি পাসকি তৈরি সেট আপ করার পরে, আপনি ব্যবহারকারীদের সাইন ইন করতে এবং তাদের পাসকি ব্যবহার করে প্রমাণীকরণ করার জন্য আপনার অ্যাপ সেট আপ করতে পারেন। এটি করার জন্য, আপনি ক্রেডেনশিয়াল ম্যানেজার ফলাফলগুলি পরিচালনা করতে আপনার প্রমাণীকরণ কোড আপডেট করবেন এবং পাসকিগুলির মাধ্যমে প্রমাণীকরণের জন্য একটি ফাংশন প্রয়োগ করবেন৷
-
getCredential()
পাঠানোর জন্য প্রয়োজনীয় তথ্য পেতে সার্ভারে আপনার সাইন ইন অনুরোধ কলটি FIDO2 বাস্তবায়নের মতোই। কোন পরিবর্তন প্রয়োজন নেই. রেজিস্টার রিকোয়েস্ট কলের মতোই, প্রত্যাবর্তিত প্রতিক্রিয়া JSONObject ফরম্যাটে রয়েছে।
/** * @param sessionId The session ID to be used for the sign-in. * @param credentialId The credential ID of this device. * @return a JSON object. */ suspend fun signinRequest(): ApiResult<JSONObject> { val call = client.newCall(Builder().url(buildString { append("$BASE_URL/signinRequest") }).method("POST", jsonRequestBody {}) .build() ) val response = call.await() return response.result("Error calling /signinRequest") { parsePublicKeyCredentialRequestOptions( body ?: throw ApiException("Empty response from /signinRequest") ) } } /** * @param sessionId The session ID to be used for the sign-in. * @param response The JSONObject for signInResponse. * @param credentialId id/rawId. * @return A list of all the credentials registered on the server, * including the newly-registered one. */ suspend fun signinResponse( sessionId: String, response: JSONObject, credentialId: String ): ApiResult<Unit> { val call = client.newCall( Builder().url("$BASE_URL/signinResponse") .addHeader("Cookie",formatCookie(sessionId)) .method("POST", jsonRequestBody { name("id").value(credentialId) name("type").value(PUBLIC_KEY.toString()) name("rawId").value(credentialId) name("response").objectValue { name("clientDataJSON").value( response.getString("clientDataJSON") ) name("authenticatorData").value( response.getString("authenticatorData") ) name("signature").value( response.getString("signature") ) name("userHandle").value( response.getString("userHandle") ) } }).build() ) val apiResponse = call.await() return apiResponse.result("Error calling /signingResponse") { } }
আপনার দৃষ্টিভঙ্গি থেকে অভিপ্রায় লঞ্চার এবং কার্যকলাপের ফলাফল কলগুলি পরিচালনা করে এমন কোনও পদ্ধতি নিরাপদে সরিয়ে দিন।
যেহেতু
signInRequest()
এখন একটিJSONObject
ফেরত দেয়, তাই আপনাকেPendingIntent
তৈরি করতে হবে না। প্রত্যাবর্তিত অভিপ্রায়টিকে একটিJSONObject
দিয়ে প্রতিস্থাপন করুন এবং আপনার API পদ্ধতিগুলি থেকেgetCredential()
কল করুন৷suspend fun getPasskey( activity: Activity, creationResult: JSONObject ): GetCredentialResponse? { Toast.makeText( activity, "Fetching previously stored credentials", Toast.LENGTH_SHORT) .show() var result: GetCredentialResponse? = null try { val request= GetCredentialRequest( listOf( GetPublicKeyCredentialOption( creationResult.toString(), null ), GetPasswordOption() ) ) result = credMan.getCredential(activity, request) if (result.credential is PublicKeyCredential) { val publicKeycredential = result.credential as PublicKeyCredential Log.i("TAG", "Passkey ${publicKeycredential.authenticationResponseJson}") return result } } catch (e: Exception) { showErrorAlert(activity, e) } return result }
একবার কল সফল হলে, ব্যবহারকারীকে যাচাই ও প্রমাণীকরণ করতে সার্ভারে প্রতিক্রিয়াটি ফেরত পাঠান। এই API কলের অনুরোধ এবং প্রতিক্রিয়া পরামিতিগুলি FIDO2 বাস্তবায়নের অনুরূপ, তাই কোনও পরিবর্তনের প্রয়োজন নেই৷
অতিরিক্ত সম্পদ
- শংসাপত্র ম্যানেজার নমুনা রেফারেন্স
- ক্রেডেনশিয়াল ম্যানেজার কোডল্যাব
- ক্রেডেনশিয়াল ম্যানেজার এপিআই ব্যবহার করে পাসকি সহ আপনার অ্যাপে নির্বিঘ্ন প্রমাণীকরণ আনা
- FIDO2 কোডল্যাব