ওয়্যারেবল ডিভাইসে যাচাইকরণ: ক্রেডেনশিয়াল ম্যানেজার

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

এই নির্দেশিকায় Wear OS অ্যাপ, ক্রেডেনশিয়াল ম্যানেজারের জন্য সাজেস্ট করা যাচাইকরণ পদ্ধতি সম্পর্কে নির্দেশাবলী দেওয়া আছে।

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

প্রাথমিক বিবেচ্য বিষয়

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

অতিথি মোড

সব কার্যকারিতার জন্য যাচাইকরণ প্রয়োজন হয় না। পরিবর্তে, ব্যবহারকারীকে সাইন-ইন করতে না দিয়েই যত বেশি সম্ভব ফিচার প্রদান করুন।

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

কিছু ডিভাইস বেশি সময় ধরে আনলক থাকতে পারে

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

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

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-এ যাচাইকরণের জন্য ক্রেডেনশিয়াল ম্যানেজার হল সাজেস্ট করা API। এটি ব্যবহারকারীদের Wear OS অ্যাপ্লিকেশনে স্ট্যান্ডঅ্যালোন সেটিংয়ে সাইন-ইন করার জন্য আরও সুরক্ষিত পরিবেশ প্রদান করে, এর জন্য কানেক্ট করা পেয়ার করা ফোন এবং পাসওয়ার্ড মনে রাখার প্রয়োজন হয় না।

এই ডকুমেন্টে সেইসব তথ্য উল্লেখ করা আছে যা স্ট্যান্ডার্ড যাচাইকরণ মেকানিজম হোস্ট করা Credential Manager সমাধান প্রয়োগ করার জন্য ডেভেলপারদের প্রয়োজন। এগুলি হল:

  • পাসকী
  • পাসওয়ার্ড
  • ফেডারেটেড পরিচয় (যেমন, Google-এর মাধ্যমে সাইন-ইন করুন)

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

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

Wear OS-এ নিম্নলিখিত সীমাবদ্ধতা ও পার্থক্য সম্পর্কে ডেভেলপারদের সচেতন থাকতে হবে:

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

Wear OS-এ পাসকী

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

পাসকী আরও সহজ

  • ব্যবহারকারীরা সাইন-ইন করার জন্য একটি অ্যাকাউন্ট বেছে নিতে পারবেন। তাদের ইউজারনেম টাইপ করতে হবে না।
  • ব্যবহারকারী ডিভাইসের স্ক্রিন লক ব্যবহার করে যাচাই করতে পারবেন।
  • পাসকী তৈরি ও রেজিস্টার করার পরে, ব্যবহারকারী সহজেই নতুন ডিভাইসে পাল্টে নিতে পারবেন এবং আবার এনরোল না করেই সেটি অবিলম্বে ব্যবহার করতে পারবেন।

পাসকী আরও নিরাপদ

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

পাসকী প্রয়োগ করা

সব ধরনের প্রয়োগের জন্য সেট-আপ ও নির্দেশাবলী অন্তর্ভুক্ত।

সেট-আপ করুন

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

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

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

বিল্ট-ইন যাচাইকরণ পদ্ধতি

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

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

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

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

যাচাইকরণের ব্যাক-আপ পদ্ধতি

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

Credential Manager স্ক্রিন ডিসমিস করার ব্যবহারকারীর অ্যাকশন হ্যান্ডেল করতে, আপনার 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 অ্যাপে কমপক্ষে একটি যাচাইকরণ পদ্ধতি থাকতে হবে, কারণ এই বিকল্পটি শুধুমাত্র Android-এর সাথে পেয়ার করা ওয়াচে কাজ করে, যখন সংশ্লিষ্ট মোবাইল অ্যাপ ইনস্টল করা থাকে। যেসব ব্যবহারকারীর কাছে সংশ্লিষ্ট মোবাইল অ্যাপ নেই অথবা যাদের 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?) {}
}

ওয়্যারেবল ডেটা লেয়ার ব্যবহার করা সম্পর্কে আরও তথ্য পেতে, Wear OS-এ ডেটা পাঠানো ও সিঙ্ক করা দেখুন।

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

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

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

PKCE কার্যকরভাবে ব্যবহার করতে, RemoteAuthClient ব্যবহার করুন। তারপর, OAuth প্রদানকারীর কাছে আপনার Wear OS অ্যাপ থেকে একটি অনুমোদন সংক্রান্ত অনুরোধ করতে, 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

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

তারপরে, ওয়াচ অ্যাপ অ্যাক্সেস টোকেনের জন্য যাচাইকরণ কোডটি এক্সচেঞ্জ করতে পারে।

ডিভাইস অনুমোদনের গ্র্যান্ট

ডিভাইস অনুমোদনের গ্র্যান্ট ব্যবহার করার সময়, ব্যবহারকারী অন্য ডিভাইসে যাচাইকরণ URI খুলবেন। তারপর, অনুমোদন সার্ভার তাদের অনুরোধটি অনুমোদন বা প্রত্যাখ্যান করতে বলে।

এই প্রসেসটি আরও সহজ করতে, ব্যবহারকারীর পেয়ার করা মোবাইল ডিভাইসে ওয়েবপেজ খুলতে, একটি 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 অ্যাপ থাকলে, টোকেন অনুমোদন করার জন্য ব্রাউজারের উপর নির্ভর না করে, আপনার অ্যাপে এই ইনটেন্ট ইন্টারসেপ্ট করতে ইউনিভার্সাল লিঙ্ক ব্যবহার করুন।