Google ব্যবহারকারীর ডেটা অ্যাক্সেস করার অনুমতি দেওয়া

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

অ্যাপের প্রয়োজনীয়তার উপর ভিত্তি করে, যাচাইকরণ ও অনুমোদন কল দুটি আলাদা ও স্বতন্ত্র ফ্লো হতে হবে ।

আপনার অ্যাপে যদি এমন ফিচার থাকে যা Google API ডেটা ব্যবহার করতে পারে, কিন্তু আপনার অ্যাপের মূল ফিচারের অংশ হিসেবে সেগুলির প্রয়োজন নেই, তাহলে এমনভাবে আপনার অ্যাপ ডিজাইন করুন যাতে API ডেটা অ্যাক্সেস করা না গেলে, সেটি সহজে ম্যানেজ করা যায়। যেমন, ব্যবহারকারী Drive অ্যাক্সেস না দিলে, আপনি সম্প্রতি সেভ করা ফাইলের তালিকা লুকাতে পারেন।

ব্যবহারকারী যখন এমন কোনও অ্যাকশন পারফর্ম করেন যার জন্য কোনও নির্দিষ্ট API অ্যাক্সেস করার প্রয়োজন হয়, শুধুমাত্র তখনই আপনার Google API অ্যাক্সেস করার জন্য প্রয়োজনীয় স্কোপে অ্যাক্সেসের অনুরোধ করা উচিত। যেমন, ব্যবহারকারী যখনই Drive-এ সেভ করুন বোতামে ট্যাপ করবেন, তখনই আপনাকে ব্যবহারকারীর Drive অ্যাক্সেস করার অনুমতি চেয়ে নিতে হবে।

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

যাচাইকরণের জন্য, আমরা ক্রেডেনশিয়াল ম্যানেজার API ব্যবহার করার সাজেশন দিই। Google-এর সেভ করা ব্যবহারকারীর ডেটা অ্যাক্সেস করার প্রয়োজন এমন অ্যাকশনকে অনুমোদন করার জন্য, আমরা AuthorizationClient ব্যবহার করার সাজেশন দিই।

আপনার Google Cloud Console প্রোজেক্ট সেট-আপ করা

  1. Cloud Console-এ আপনার প্রোজেক্ট খুলুন অথবা আগে থেকে কোনও প্রোজেক্ট না থাকলে, একটি তৈরি করুন।
  2. ব্র্যান্ডিং পৃষ্ঠায়, সব তথ্য সম্পূর্ণ ও সঠিক আছে কিনা তা নিশ্চিত করুন।
    1. আপনার অ্যাপে যেন সঠিক অ্যাপের নাম, অ্যাপের লোগো ও অ্যাপের হোমপেজ অ্যাসাইন করা থাকে, তা নিশ্চিত করুন। সাইন-আপ করার সময় 'Google-এর মাধ্যমে সাইন-ইন করুন' সম্মতি স্ক্রিনে এবং থার্ড-পার্টি অ্যাপ ও পরিষেবা স্ক্রিনে ব্যবহারকারীদের এই ভ্যালু দেখানো হবে।
    2. আপনার অ্যাপের গোপনীয়তা নীতি ও পরিষেবার শর্তাবলীর URL উল্লেখ করেছেন কিনা তা ভালভাবে দেখে নিন।
  3. ক্লায়েন্ট পৃষ্ঠায়, আপনার অ্যাপের জন্য Android ক্লায়েন্ট আইডি তৈরি করুন, যদি আপনার কাছে আগে থেকে কোনও আইডি না থাকে। আপনাকে নিজের অ্যাপের প্যাকেজের নাম ও SHA-1 স্বাক্ষর উল্লেখ করতে হবে।
    1. ক্লায়েন্ট পৃষ্ঠায় যান।
    2. ক্লায়েন্ট তৈরি করুন বিকল্পে ক্লিক করুন।
    3. Android অ্যাপ্লিকেশন ধরন বেছে নিন।
    4. OAuth ক্লায়েন্টের নাম লিখুন। ক্লায়েন্টকে শনাক্ত করার জন্য এই নাম আপনার প্রজেক্টের ক্লায়েন্ট পৃষ্ঠায় দেখানো হয়।
    5. আপনার Android অ্যাপের প্যাকেজের নাম লিখুন। এই ভ্যালু আপনার AndroidManifest.xml ফাইলে package অ্যাট্রিবিউটের <manifest> এলিমেন্টে সংজ্ঞায়িত করা আছে।
    6. অ্যাপ ডিস্ট্রিবিউশনের SHA-1 সাইনিং সার্টিফিকেট ফিঙ্গারপ্রিন্ট লিখুন।
    7. আপনার অ্যাপ Google Play-এর মাধ্যমে অ্যাপ সাইনিং ব্যবহার করলে, Play Console-এর অ্যাপ সাইনিং পৃষ্ঠা থেকে SHA-1 ফিঙ্গারপ্রিন্ট কপি করুন।
    8. আপনি নিজের কীস্টোর ও সাইনিং কী ম্যানেজ করলে, হিউম্যান-রিডেবল ফর্ম্যাটে সার্টিফিকেট সংক্রান্ত তথ্য প্রিন্ট করতে, Java-এর সাথে অন্তর্ভুক্ত keytool ইউটিলিটি ব্যবহার করুন। keytool আউটপুটের Certificate fingerprints বিভাগে SHA-1 ভ্যালু কপি করুন। আরও তথ্যের জন্য, Android ডকুমেন্টেশনের জন্য Google API-তে আপনার ক্লায়েন্টকে যাচাই করা দেখুন।
    9. (ঐচ্ছিক) আপনার Android অ্যাপ্লিকেশনের মালিকানা যাচাই করুন।
  4. ক্লায়েন্ট পৃষ্ঠায়, আগে থেকে না থাকলে, নতুন "ওয়েব অ্যাপ্লিকেশন" ক্লায়েন্ট আইডি তৈরি করুন। আপনি এখনকার মতো "অনুমোদিত জাভাস্ক্রিপ্ট অরিজিন" ও "অনুমোদিত রিডাইরেক্ট URI" ফিল্ড এড়িয়ে যেতে পারেন। Google-এর যাচাইকরণ পরিষেবার সাথে যোগাযোগ করার সময় আপনার ব্যাক-এন্ড সার্ভারকে শনাক্ত করতে এই ক্লায়েন্ট আইডি ব্যবহার করা হবে।
    1. ক্লায়েন্ট পৃষ্ঠায় যান।
    2. ক্লায়েন্ট তৈরি করুন বিকল্পে ক্লিক করুন।
    3. ওয়েব অ্যাপ্লিকেশন ধরন বেছে নিন।

অ্যাপের মালিকানা যাচাই করা

অ্যাপের ছদ্মবেশীতা সংক্রান্ত ঝুঁকি কমাতে, আপনার অ্যাপ্লিকেশনের মালিকানা যাচাই করতে পারবেন।

যাচাইকরণ প্রসেস সম্পূর্ণ করতে, আপনার কাছে Google Play Developer অ্যাকাউন্ট থাকলে এবং আপনার অ্যাপ Google Play Console-এ রেজিস্টার করা থাকলে, আপনি সেটি ব্যবহার করতে পারবেন। সঠিকভাবে যাচাইকরণের জন্য নিচে উল্লেখ করা শর্তগুলি পূরণ করতে হবে:

  • আপনি যে Android OAuth ক্লায়েন্টের জন্য যাচাইকরণ সম্পূর্ণ করছেন, সেটির প্যাকেজের নাম ও SHA-1 সাইনিং সার্টিফিকেট ফিঙ্গারপ্রিন্টের সাথে Google Play Console-এ রেজিস্টার করা অ্যাপ্লিকেশনের প্যাকেজের নাম ও SHA-1 সাইনিং সার্টিফিকেট ফিঙ্গারপ্রিন্ট একই হতে হবে।
  • Google Play Console-এ অ্যাপের জন্য আপনার কাছে অ্যাডমিন অনুমতি থাকতে হবে। Google Play Console-এ অ্যাক্সেস ম্যানেজমেন্ট সম্পর্কে আরও জানুন ।

Android ক্লায়েন্টের অ্যাপের মালিকানা যাচাই করুন বিভাগে, যাচাইকরণ প্রসেস সম্পূর্ণ করতে মালিকানা যাচাই করুন বোতামে ক্লিক করুন।

যাচাইকরণ সম্পূর্ণ হলে, যাচাইকরণ প্রক্রিয়া সম্পূর্ণ হওয়ার বিষয়টি কনফার্ম করতে একটি বিজ্ঞপ্তি দেখানো হবে। অন্যথায়, একটি সমস্যার প্রম্পট দেখানো হবে।

যাচাইকরণ সম্পূর্ণ না হলে, নিম্নলিখিত বিষয়গুলি চেষ্টা করে দেখুন:

  • আপনি যে অ্যাপ যাচাই করছেন সেটি Google Play Console-এ রেজিস্টার করা আছে কিনা তা নিশ্চিত করুন।
  • Google Play Console-এ অ্যাপের জন্য আপনার কাছে অ্যাডমিন অনুমতি আছে কিনা তা নিশ্চিত করুন।

ডিপেন্ডেন্সি ঘোষণা করা

আপনার মডিউলের build.gradle ফাইলে, Google Identity Services লাইব্রেরির লেটেস্ট ভার্সন ব্যবহার করে ডিপেন্ডেন্সি ঘোষণা করুন।

dependencies {
  // ... other dependencies

  implementation "com.google.android.gms:play-services-auth:22.0.0"
}

ব্যবহারকারীর অ্যাকশনের জন্য প্রয়োজনীয় অনুমতি চাওয়া

কোনও ব্যবহারকারী যখনই এমন কোনও অ্যাকশন পারফর্ম করেন যার জন্য অতিরিক্ত স্কোপের প্রয়োজন হয়, তখন AuthorizationClient.authorize() কল করুন। যেমন, কোনও ব্যবহারকারী যদি এমন কোনও অ্যাকশন নেন যার জন্য তার Drive অ্যাপ স্টোরেজে অ্যাক্সেস প্রয়োজন, তাহলে নিম্নলিখিত কাজগুলি করুন:

Kotlin

val requestedScopes: List<Scope> = listOf(DriveScopes.DRIVE_FILE)
val authorizationRequest = AuthorizationRequest.builder()
    .setRequestedScopes(requestedScopes)
    .build()

Identity.getAuthorizationClient(activity)
    .authorize(authorizationRequestBuilder.build())
    .addOnSuccessListener { authorizationResult ->
        if (authorizationResult.hasResolution()) {
            val pendingIntent = authorizationResult.pendingIntent
            // Access needs to be granted by the user
            startAuthorizationIntent.launch(IntentSenderRequest.Builder(pendingIntent!!.intentSender).build())
        } else {
            // Access was previously granted, continue with user action
            saveToDriveAppFolder(authorizationResult);
        }
    }
    .addOnFailureListener { e -> Log.e(TAG, "Failed to authorize", e) }

জাভা

List<Scopes> requestedScopes = Arrays.asList(DriveScopes.DRIVE_FILE);
AuthorizationRequest authorizationRequest = AuthorizationRequest.builder()
    .setRequestedScopes(requestedScopes)
    .build();

Identity.getAuthorizationClient(activity)
    .authorize(authorizationRequest)
    .addOnSuccessListener(authorizationResult -> {
        if (authorizationResult.hasResolution()) {
            // Access needs to be granted by the user
            startAuthorizationIntent.launch(
                new IntentSenderRequest.Builder(
                    authorizationResult.getPendingIntent().getIntentSender()
                ).build()
            );
        } else {
            // Access was previously granted, continue with user action
            saveToDriveAppFolder(authorizationResult);
        }
    })
    .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));

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

Kotlin

private lateinit var startAuthorizationIntent: ActivityResultLauncher<IntentSenderRequest>

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?,
): View? {
    // ...
    startAuthorizationIntent =
        registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { activityResult ->
            try {
                // extract the result
                val authorizationResult = Identity.getAuthorizationClient(requireContext())
                    .getAuthorizationResultFromIntent(activityResult.data)
                // continue with user action
                saveToDriveAppFolder(authorizationResult);
            } catch (e: ApiException) {
                // log exception
            }
        }
}

জাভা

private ActivityResultLauncher<IntentSenderRequest> startAuthorizationIntent;

@Override
public View onCreateView(
    @NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// ...
startAuthorizationIntent =
    registerForActivityResult(
        new ActivityResultContracts.StartIntentSenderForResult(),
        activityResult -> {
            try {
            // extract the result
            AuthorizationResult authorizationResult =
                Identity.getAuthorizationClient(requireActivity())
                    .getAuthorizationResultFromIntent(activityResult.getData());
            // continue with user action
            saveToDriveAppFolder(authorizationResult);
            } catch (ApiException e) {
            // log exception
            }
        });
}

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

ব্যবহারকারীর ডেটা বা রিসোর্সে অ্যাক্সেস করার অনুমতি প্রত্যাহার করা

আগে দেওয়া অ্যাক্সেস তুলে নিতে, AuthorizationClient.revokeAccess() নম্বরে কল করুন। যেমন, ব্যবহারকারী আপনার অ্যাপ থেকে তার অ্যাকাউন্ট সরিয়ে দিলে এবং আপনার অ্যাপকে আগে DriveScopes.DRIVE_FILE-এ অ্যাক্সেস দেওয়া হয়ে থাকলে, অ্যাক্সেস প্রত্যাহার করতে নিম্নলিখিত কোড ব্যবহার করুন:

Kotlin

val requestedScopes: MutableList<Scope> = mutableListOf(DriveScopes.DRIVE_FILE)
RevokeAccessRequest revokeAccessRequest = RevokeAccessRequest.builder()
    .setAccount(account)
    .setScopes(requestedScopes)
    .build()

Identity.getAuthorizationClient(activity)
    .revokeAccess(revokeAccessRequest)
    .addOnSuccessListener { Log.i(TAG, "Successfully revoked access") }
    .addOnFailureListener { e -> Log.e(TAG, "Failed to revoke access", e) }

জাভা

List<Scopes> requestedScopes = Arrays.asList(DriveScopes.DRIVE_FILE);
RevokeAccessRequest revokeAccessRequest = RevokeAccessRequest.builder()
    .setAccount(account)
    .setScopes(requestedScopes)
    .build();

Identity.getAuthorizationClient(activity)
    .revokeAccess(revokeAccessRequest)
    .addOnSuccessListener(unused -> Log.i(TAG, "Successfully revoked access"))
    .addOnFailureListener(e -> Log.e(TAG, "Failed to revoke access", e));

টোকেন ক্যাশে মুছুন

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

Kotlin

Identity.getAuthorizationClient(activity)
    .clearToken(ClearTokenRequest.builder().setToken(invalidAccessToken).build())
    .addOnSuccessListener { Log.i(TAG, "Successfully removed the token from the cache") }
    .addOnFailureListener{ e -> Log.e(TAG, "Failed to clear token", e) }

জাভা

Identity.getAuthorizationClient(activity)
    .clearToken(ClearTokenRequest.builder().setToken(invalidAccessToken).build())
    .addOnSuccessListener(unused -> Log.i(TAG, "Successfully removed the token from the cache"))
    .addOnFailureListener(e -> Log.e(TAG, "Failed to clear the token cache", e));

অনুমোদন চলাকালীন ব্যবহারকারীর তথ্য পাওয়া

অনুমোদন সংক্রান্ত উত্তরে ব্যবহার করা অ্যাকাউন্ট সম্পর্কে কোনও তথ্য নেই; উত্তরে শুধুমাত্র অনুরোধ করা স্কোপের জন্য একটি টোকেন আছে। যেমন, কোনও ব্যবহারকারীর Google Drive অ্যাক্সেস করার জন্য অ্যাক্সেস টোকেন পাওয়ার উত্তরে, ব্যবহারকারীর বেছে নেওয়া অ্যাকাউন্টের পরিচয় প্রকাশ করা হয় না, যদিও এটি ব্যবহারকারীর Drive-এ থাকা ফাইল অ্যাক্সেস করার জন্য ব্যবহার করা যেতে পারে। ব্যবহারকারীর নাম বা ইমেলের মতো তথ্য পেতে, আপনার কাছে নিম্নলিখিত বিকল্প আছে:

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

  • আপনার অনুমোদনের অনুরোধে, আপনি যেসব স্কোপ চান (যেমন, Drive scope) তার সাথে সাথে userinfo, profile ও openid স্কোপের জন্য অনুরোধ করুন। অ্যাক্সেস টোকেন ফেরত পাওয়ার পরে, আপনার পছন্দের HTTP লাইব্রেরি ব্যবহার করে এবং হেডার থেকে পাওয়া অ্যাক্সেস টোকেন যোগ করে GET OAuth userinfo এন্ডপয়েন্টে HTTP অনুরোধ (https://www.googleapis.com/oauth2/v3/userinfo) করে ব্যবহারকারীর তথ্য পান। এটি নিম্নলিখিত curl কমান্ডের সমতুল্য:

    curl -X GET \ "https://www.googleapis.com/oauth2/v1/userinfo?alt=json" \ -H "Authorization: Bearer $TOKEN"
    

    রেসপন্স হল UserInfo, যা অনুরোধ করা স্কোপের মধ্যে সীমাবদ্ধ এবং JSON ফর্ম্যাটে ফর্ম্যাট করা।

নন-ডিফল্ট অ্যাকাউন্ট থেকে অনুমোদন

যাচাইকরণের জন্য আপনি Credential Manager ব্যবহার করলে এবং AuthorizationClient.authorize() রান করালে, আপনার অ্যাপের ডিফল্ট অ্যাকাউন্ট হিসেবে ব্যবহারকারীর বেছে নেওয়া অ্যাকাউন্ট সেট করা হয়। এর অর্থ হল, অনুমোদনের জন্য পরবর্তী যেকোনও কলের ক্ষেত্রে এই ডিফল্ট অ্যাকাউন্ট ব্যবহার করা হবে। অ্যাকাউন্ট বাছাইকারীকে জোর করে দেখাতে, ক্রেডেনশিয়াল ম্যানেজার থেকে clearCredentialState() API ব্যবহার করে অ্যাপ থেকে ব্যবহারকারীকে সাইন-আউট করুন।

ব্যবহারকারীর ডেটাতে অ্যাক্সেস বজায় রাখা

আপনার অ্যাপ থেকে ব্যবহারকারীর ডেটা অ্যাক্সেস করার প্রয়োজন হলে, একবার AuthorizationClient.authorize() কল করুন; পরবর্তী সেশনগুলিতে এবং ব্যবহারকারী যতক্ষণ পর্যন্ত মঞ্জুর করা অনুমতি সরিয়ে না দেন, ততক্ষণ আপনার উদ্দেশ্য পূরণ করার জন্য একই মেথড কল করে অ্যাক্সেস টোকেন পান, এর জন্য ব্যবহারকারীর সাথে কোনও ইন্টার‍্যাকশন করতে হবে না। অন্যদিকে, আপনার ব্যাকএন্ড সার্ভার থেকে অফলাইন মোডে ব্যবহারকারীর ডেটা অ্যাক্সেস করতে চাইলে, আপনাকে অন্য ধরনের টোকেনের জন্য অনুরোধ করতে হবে, যাকে "রিফ্রেশ টোকেন" বলা হয়।

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

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

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

Kotlin

// Ask for offline access during the first authorization request
val authorizationRequest = AuthorizationRequest.builder()
    .setRequestedScopes(requestedScopes)
    .requestOfflineAccess(serverClientId)
    .build()

Identity.getAuthorizationClient(activity)
    .authorize(authorizationRequest)
    .addOnSuccessListener { authorizationResult ->
        startAuthorizationIntent.launch(IntentSenderRequest.Builder(
            pendingIntent!!.intentSender
        ).build())
    }
    .addOnFailureListener { e -> Log.e(TAG, "Failed to authorize", e) }

জাভা

// Ask for offline access during the first authorization request
AuthorizationRequest authorizationRequest = AuthorizationRequest.builder()
    .setRequestedScopes(requestedScopes)
    .requestOfflineAccess(serverClientId)
    .build();

Identity.getAuthorizationClient(getContext())
    .authorize(authorizationRequest)
    .addOnSuccessListener(authorizationResult -> {
        startAuthorizationIntent.launch(
            new IntentSenderRequest.Builder(
                authorizationResult.getPendingIntent().getIntentSender()
            ).build()
        );
    })
    .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize"));

নিচে দেওয়া স্নিপেটে ধরে নেওয়া হয়েছে যে কোনও ফ্র্যাগমেন্ট থেকে অনুমোদন শুরু করা হয়েছে।

Kotlin

private lateinit var startAuthorizationIntent: ActivityResultLauncher<IntentSenderRequest>

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?,
): View? {
    // ...
    startAuthorizationIntent =
        registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { activityResult ->
            try {
                val authorizationResult = Identity.getAuthorizationClient(requireContext())
                    .getAuthorizationResultFromIntent(activityResult.data)
                // short-lived access token
                accessToken = authorizationResult.accessToken
                // store the authorization code used for getting a refresh token safely to your app's backend server
                val authCode: String = authorizationResult.serverAuthCode
                storeAuthCodeSafely(authCode)
            } catch (e: ApiException) {
                // log exception
            }
        }
}

জাভা

private ActivityResultLauncher<IntentSenderRequest> startAuthorizationIntent;

@Override
public View onCreateView(
    @NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // ...
    startAuthorizationIntent =
        registerForActivityResult(
            new ActivityResultContracts.StartIntentSenderForResult(),
            activityResult -> {
                try {
                    AuthorizationResult authorizationResult =
                        Identity.getAuthorizationClient(requireActivity())
                            .getAuthorizationResultFromIntent(activityResult.getData());
                    // short-lived access token
                    accessToken = authorizationResult.getAccessToken();
                    // store the authorization code used for getting a refresh token safely to your app's backend server
                    String authCode = authorizationResult.getServerAuthCode()
                    storeAuthCodeSafely(authCode);
                } catch (ApiException e) {
                    // log exception
                }
            });
}