পরিধানযোগ্য জিনিসপত্রের প্রমাণীকরণ: শংসাপত্র ম্যানেজার

Wear OS অ্যাপগুলো কোনো সহযোগী অ্যাপ ছাড়াই স্বতন্ত্রভাবে চলতে পারে। এর মানে হলো, ইন্টারনেট থেকে ডেটা অ্যাক্সেস করার সময় একটি Wear OS অ্যাপকে নিজের থেকেই অথেনটিকেশন পরিচালনা করতে হয়। কিন্তু ঘড়িটির ছোট স্ক্রিন এবং সীমিত ইনপুট ক্ষমতার কারণে একটি Wear OS অ্যাপের জন্য অথেনটিকেশনের বিকল্পগুলো সীমিত হয়ে যায়।

এই নির্দেশিকাটি Wear OS অ্যাপের জন্য প্রস্তাবিত প্রমাণীকরণ পদ্ধতি, ক্রেডেনশিয়াল ম্যানেজার (Credential Manager) ব্যবহারের নির্দেশনা প্রদান করে।

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

প্রাথমিক বিবেচনা

বাস্তবায়ন শুরু করার আগে নিম্নলিখিত বিষয়গুলো বিবেচনা করুন।

অতিথি মোড

সমস্ত কার্যকারিতার জন্য প্রমাণীকরণের প্রয়োজন নেই। এর পরিবর্তে, ব্যবহারকারীকে সাইন ইন করার প্রয়োজন ছাড়াই যতটা সম্ভব বৈশিষ্ট্য প্রদান করুন।

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

কিছু ডিভাইস বেশিক্ষণ আনলক থাকতে পারে।

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

যদি আপনার অ্যাপের উচ্চতর নিরাপত্তার প্রয়োজন হয়—যেমন সংবেদনশীল বা ব্যক্তিগত তথ্য প্রদর্শনের ক্ষেত্রে—প্রথমে যাচাই করুন কব্জি শনাক্তকরণ (wrist detection) চালু আছে কিনা:

fun isWristDetectionAutoLockingEnabled(context: Context): Boolean {
    // Use the keyguard manager to check for the presence of a lock mechanism
    val keyguardManager = context.getSystemService<KeyguardManager>()
    val isSecured = keyguardManager?.isDeviceSecure == true

    // Use OEM-specific system settings to verify that on-body autolock is enabled.
    val isWristDetectionOn = android.provider.Settings.Global.getInt(
        context.contentResolver, PIXEL_WRIST_AUTOLOCK_SETTING_STATE,
        0
    ) == 1

    return isSecured && isWristDetectionOn
}

এই মেথডের রিটার্ন ভ্যালু যদি false হয়, তাহলে ব্যবহারকারী-নির্দিষ্ট কন্টেন্ট দেখানোর আগে তাকে আপনার অ্যাপে একটি অ্যাকাউন্টে সাইন ইন করতে বলুন।

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

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

এই ডকুমেন্টটিতে ডেভেলপারদের জন্য একটি ক্রেডেনশিয়াল ম্যানেজার সলিউশন বাস্তবায়নের জন্য প্রয়োজনীয় তথ্যের রূপরেখা দেওয়া হয়েছে, যা এর অন্তর্ভুক্ত স্ট্যান্ডার্ড অথেনটিকেশন মেকানিজমগুলোসহ নিম্নরূপ:

  • পাসকি
  • পাসওয়ার্ড
  • ফেডারেটেড আইডেন্টিটি (যেমন গুগল দিয়ে সাইন ইন)

এই নির্দেশিকায় ক্রেডেনশিয়াল ম্যানেজারের ব্যাকআপ হিসেবে অন্যান্য গ্রহণযোগ্য Wear OS প্রমাণীকরণ পদ্ধতি ( ডেটা লেয়ার টোকেন শেয়ারিং এবং OAuth ) মাইগ্রেট করার নির্দেশনা এবং বর্তমানে অপ্রচলিত স্বতন্ত্র গুগল সাইন ইন বাটন থেকে এমবেডেড ক্রেডেনশিয়াল ম্যানেজার সংস্করণে রূপান্তর পরিচালনা করার জন্য বিশেষ নির্দেশনাও দেওয়া হয়েছে।

Wear OS-এর সীমাবদ্ধতা এবং পার্থক্য

ডেভেলপারদের Wear OS-এর নিম্নলিখিত সীমাবদ্ধতা এবং পার্থক্যগুলো সম্পর্কে সচেতন থাকা উচিত:

  • ক্রেডেনশিয়াল ম্যানেজার Wear OS 3 এবং এর পরবর্তী সংস্করণগুলোতে উপলব্ধ।
  • Wear OS-এ ক্রেডেনশিয়াল তৈরি করা যাবে না।
  • ক্রেডেনশিয়াল পুনরুদ্ধার বা হাইব্রিড সাইন-ইন ফ্লো কোনোটিই সমর্থিত নয়।
  • শুধুমাত্র Wear OS ইন্টিগ্রেশন থাকা ক্রেডেনশিয়াল প্রোভাইডারদেরই মোবাইল থেকে পুনরায় ব্যবহার করা যাবে।

Wear OS-এ পাসকি

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

পাসকিগুলো আরও সহজ

  • ব্যবহারকারীরা সাইন ইন করার জন্য একটি অ্যাকাউন্ট বেছে নিতে পারেন। তাদের কোনো ইউজারনেম টাইপ করার প্রয়োজন নেই।
  • ব্যবহারকারীরা ডিভাইসের স্ক্রিন লক ব্যবহার করে প্রমাণীকরণ করতে পারেন।
  • একবার একটি পাসকি তৈরি ও নিবন্ধন করা হয়ে গেলে, ব্যবহারকারীকে পুনরায় নথিভুক্ত করার প্রয়োজন ছাড়াই নির্বিঘ্নে একটি নতুন ডিভাইসে গিয়ে তা অবিলম্বে ব্যবহার করতে পারেন।

পাসকিগুলো আরও নিরাপদ

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

পাসকি প্রয়োগ করুন

সকল প্রকার বাস্তবায়নের জন্য সেটআপ এবং নির্দেশিকা অন্তর্ভুক্ত রয়েছে।

সেটআপ

  1. আপনার অ্যাপ্লিকেশন মডিউলের build.gradle ফাইলে টার্গেট এপিআই লেভেল ৩৫-এ সেট করুন:

    android {
        defaultConfig {
            targetSdk(35)
        }
    }
    
  2. androidx.credentials রিলিজ রেফারেন্স থেকে সর্বশেষ স্থিতিশীল সংস্করণটি ব্যবহার করে আপনার অ্যাপ বা মডিউলের build.gradle ফাইলে নিম্নলিখিত লাইনগুলো যোগ করুন।

    androidx.credentials:credentials:1.6.0
    androidx.credentials:credentials-play-services-auth:1.6.0
    

অন্তর্নির্মিত প্রমাণীকরণ পদ্ধতি

যেহেতু ক্রেডেনশিয়াল ম্যানেজার একটি সমন্বিত এপিআই, তাই Wear OS-এর জন্য এটি বাস্তবায়নের ধাপগুলো অন্য যেকোনো ডিভাইসের ধরনের মতোই।

শুরু করতে এবং পাসকি ও পাসওয়ার্ড সমর্থন চালু করতে মোবাইল নির্দেশাবলী ব্যবহার করুন।

ক্রেডেনশিয়াল ম্যানেজারে ‘সাইন ইন উইথ গুগল’ সাপোর্ট যোগ করার ধাপগুলো মোবাইল ডেভেলপমেন্টের কথা মাথায় রেখে তৈরি করা হলেও, Wear OS-এর ক্ষেত্রেও পদ্ধতিগুলো একই।

উল্লেখ্য যে, যেহেতু Wear OS-এ ক্রেডেনশিয়াল তৈরি করা যায় না, তাই মোবাইলের নির্দেশাবলীতে উল্লেখিত ক্রেডেনশিয়াল তৈরির পদ্ধতিগুলো প্রয়োগ করার প্রয়োজন নেই।

ব্যাকআপ প্রমাণীকরণ পদ্ধতি

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

ক্রেডেনশিয়াল ম্যানেজার স্ক্রিনটি বন্ধ করার ব্যবহারকারী অ্যাকশনটি হ্যান্ডেল করতে, আপনার GetCredential লজিকের অংশ হিসেবে একটি NoCredentialException ক্যাচ করুন এবং আপনার নিজস্ব কাস্টম অথেন্টিকেশন UI-তে নেভিগেট করুন।

try {
    val getCredentialResponse: GetCredentialResponse =
        credentialManager.getCredential(activity, createGetCredentialRequest())
    return authenticate(getCredentialResponse.credential)
} catch (_: GetCredentialCancellationException) {
    navigateToSecondaryAuthentication()
}

এরপর আপনার কাস্টম অথেন্টিকেশন UI , সাইন-ইন UX গাইডে বর্ণিত অন্য যেকোনো গ্রহণযোগ্য অথেন্টিকেশন পদ্ধতি প্রদান করতে পারে।

ডেটা লেয়ার টোকেন শেয়ারিং

ফোন কম্প্যানিয়ন অ্যাপটি Wearable Data Layer API ব্যবহার করে Wear OS অ্যাপে নিরাপদে অথেনটিকেশন ডেটা স্থানান্তর করতে পারে। ক্রেডেনশিয়ালগুলো মেসেজ অথবা ডেটা আইটেম হিসেবে স্থানান্তর করুন।

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

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

নিম্নলিখিত উদাহরণে দেখানো অনুযায়ী, মোবাইল অ্যাপের ডেটা লেয়ার ব্যবহার করে টোকেন প্রেরণ করুন:

val token = "..." // Auth token to transmit to the Wear OS device.
val putDataReq: PutDataRequest = PutDataMapRequest.create("/auth").run {
    dataMap.putString("token", token)
    asPutDataRequest()
}
val putDataTask: Task<DataItem> = Wearable.getDataClient(this).putDataItem(putDataReq)

নিম্নলিখিত উদাহরণে দেখানো অনুযায়ী Wear OS অ্যাপে ডেটা পরিবর্তনের ইভেন্টগুলো শুনুন:

class AuthDataListenerService : WearableListenerService() {
    override fun onDataChanged(dataEvents: DataEventBuffer) {
        dataEvents.forEach { event ->
            if (event.type == DataEvent.TYPE_CHANGED) {
                val dataItemPath = event.dataItem.uri.path ?: ""

                if (dataItemPath.startsWith("/auth")) {
                    val token = DataMapItem.fromDataItem(event.dataItem)
                        .dataMap
                        .getString("token")
                    // Display an interstitial screen to notify the user that they're being signed
                    // in. Then, store the token and use it in network requests.
                    handleSignInSequence(token)
                }
            }
        }
    }

    /** placeholder sign in handler. */
    fun handleSignInSequence(token: String?) {}
}

Wearable Data Layer ব্যবহার করার বিষয়ে আরও তথ্যের জন্য, Wear OS-এ ডেটা পাঠান এবং সিঙ্ক করুন (Send and sync data on Wear OS) দেখুন।

OAuth 2.0 ব্যবহার করুন

Wear OS দুটি OAuth 2.0-ভিত্তিক ফ্লো সমর্থন করে, যেগুলো নিম্নলিখিত বিভাগগুলিতে বর্ণনা করা হয়েছে:

  • RFC 7636- এ সংজ্ঞায়িত কোড বিনিময়ের জন্য প্রুফ কী সহ অনুমোদন কোড প্রদান (PKCE)।
  • RFC 8628- এ সংজ্ঞায়িত ডিভাইস অনুমোদন অনুদান (DAG)।
কোড বিনিময়ের জন্য প্রমাণ কী (PKCE)

PKCE কার্যকরভাবে ব্যবহার করতে, RemoteAuthClient ব্যবহার করুন। এরপর, আপনার Wear OS অ্যাপ থেকে কোনো OAuth প্রোভাইডারের কাছে অথেন্টিকেশন রিকোয়েস্ট পাঠানোর জন্য, একটি OAuthRequest অবজেক্ট তৈরি করুন। এই অবজেক্টটিতে টোকেন পাওয়ার জন্য আপনার OAuth এন্ডপয়েন্টের একটি URL এবং একটি CodeChallenge অবজেক্ট থাকে।

নিচের কোডটিতে একটি অথোরাইজেশন রিকোয়েস্ট তৈরি করার উদাহরণ দেখানো হয়েছে:

val oauthRequest = OAuthRequest.Builder(context)
    .setAuthProviderUrl(uri)
    .setCodeChallenge(codeChallenge)
    .setClientId(CLIENT_ID)
    .build()

অথোরাইজেশন রিকোয়েস্টটি তৈরি করার পর, sendAuthorizationRequest() মেথডটি ব্যবহার করে সেটি কম্প্যানিয়ন অ্যাপে পাঠিয়ে দিন:

RemoteAuthClient.create(context).sendAuthorizationRequest(
    request = oauthRequest,
    executor = { command -> command?.run() },
    clientCallback = object : RemoteAuthClient.Callback() {
        override fun onAuthorizationResponse(
            request: OAuthRequest,
            response: OAuthResponse
        ) {
            // Extract the token from the response, store it, and use it in requests.
            continuation.resume(parseCodeFromResponse(response))
        }
        override fun onAuthorizationError(request: OAuthRequest, errorCode: Int) {
            // Handle Errors
            continuation.resume(Result.failure(IOException("Authorization failed")))
        }
    }
)

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

অনুমোদন সফল বা ব্যর্থ হওয়ার পর, OAuth 2.0 সার্ভার অনুরোধে উল্লেখিত URL-এ রিডাইরেক্ট করে। যদি ব্যবহারকারী অ্যাক্সেসের অনুরোধটি অনুমোদন করেন, তাহলে রেসপন্সে একটি অনুমোদন কোড থাকে। যদি ব্যবহারকারী অনুরোধটি অনুমোদন না করেন, তাহলে রেসপন্সে একটি ত্রুটির বার্তা থাকে।

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

  https://wear.googleapis.com/3p_auth/com.your.package.name?code=xyz
  https://wear.googleapis-cn.com/3p_auth/com.your.package.name?code=xyz

এটি এমন একটি পৃষ্ঠা লোড করে যা ব্যবহারকারীকে কম্প্যানিয়ন অ্যাপে নিয়ে যায়। কম্প্যানিয়ন অ্যাপটি রেসপন্স ইউআরএল যাচাই করে এবং onAuthorizationResponse এপিআই ব্যবহার করে আপনার Wear OS অ্যাপে রেসপন্সটি পাঠিয়ে দেয়।

এরপর ওয়াচ অ্যাপটি অনুমোদন কোডটির বিনিময়ে একটি অ্যাক্সেস টোকেন প্রদান করতে পারে।

ডিভাইস অনুমোদন মঞ্জুরি

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

এই প্রক্রিয়াটি সহজ করার জন্য, ব্যবহারকারীর পেয়ার করা মোবাইল ডিভাইসে একটি ওয়েব পেজ খুলতে RemoteActivityHelper ব্যবহার করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

// Request access from the authorization server and receive Device Authorization Response.
private fun verifyDeviceAuthGrant(verificationUri: String) {
    RemoteActivityHelper(context).startRemoteActivity(
        Intent(Intent.ACTION_VIEW).apply {
            addCategory(Intent.CATEGORY_BROWSABLE)
            data = Uri.parse(verificationUri)
        },
        null
    )
}

আপনার যদি একটি iOS অ্যাপ থাকে, তাহলে টোকেন অনুমোদনের জন্য ব্রাউজারের উপর নির্ভর না করে, আপনার অ্যাপের মধ্যেই এই ইন্টেন্টটি গ্রহণ করতে ইউনিভার্সাল লিঙ্ক ব্যবহার করুন।