Google ব্যবহারকারীর ডেটা অ্যাক্সেস অনুমোদন করুন

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

প্রমাণীকরণ এবং অনুমোদন কলগুলি অ্যাপের প্রয়োজনের উপর ভিত্তি করে দুটি পৃথক এবং স্বতন্ত্র প্রবাহ হওয়া উচিত।

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

আপনার সেই স্কোপগুলিতে অ্যাক্সেসের অনুরোধ করা উচিত যা আপনাকে Google API অ্যাক্সেস করতে হবে শুধুমাত্র তখনই যখন ব্যবহারকারী এমন একটি ক্রিয়া সম্পাদন করে যার জন্য একটি নির্দিষ্ট API অ্যাক্সেসের প্রয়োজন হয়৷ উদাহরণস্বরূপ, যখনই ব্যবহারকারী একটি "ড্রাইভে সংরক্ষণ করুন" বোতামে ট্যাপ করে তখনই আপনাকে ব্যবহারকারীর ড্রাইভ অ্যাক্সেস করার অনুমতির অনুরোধ করা উচিত৷

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

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

আপনার সেট আপ প্রকল্প

  1. আপনার প্রকল্প খুলুন , অথবা আপনার কাছে ইতিমধ্যে একটি না থাকলে একটি প্রকল্প তৈরি করুন৷
  2. উপর , নিশ্চিত করুন যে সমস্ত তথ্য সম্পূর্ণ এবং সঠিক।
    1. নিশ্চিত করুন যে আপনার অ্যাপে একটি সঠিক অ্যাপের নাম, অ্যাপ লোগো এবং অ্যাপ হোমপেজ অ্যাসাইন করা আছে। এই মানগুলি সাইন আপে Google-এর সম্মতি দিয়ে সাইন ইন স্ক্রিনে এবং থার্ড-পার্টি অ্যাপ ও পরিষেবার স্ক্রিনে ব্যবহারকারীদের কাছে উপস্থাপন করা হবে।
    2. নিশ্চিত করুন যে আপনি আপনার অ্যাপের গোপনীয়তা নীতি এবং পরিষেবার শর্তাবলীর URLগুলি নির্দিষ্ট করেছেন৷
  3. মধ্যে , আপনার অ্যাপের জন্য একটি অ্যান্ড্রয়েড ক্লায়েন্ট আইডি তৈরি করুন যদি আপনার কাছে ইতিমধ্যে একটি না থাকে। আপনাকে আপনার অ্যাপের প্যাকেজের নাম এবং SHA-1 স্বাক্ষর উল্লেখ করতে হবে।
    1. যান .
    2. ক্লায়েন্ট তৈরি করুন ক্লিক করুন।
    3. অ্যান্ড্রয়েড অ্যাপ্লিকেশন প্রকার নির্বাচন করুন.
  4. মধ্যে , একটি নতুন "ওয়েব অ্যাপ্লিকেশন" ক্লায়েন্ট আইডি তৈরি করুন যদি আপনার ইতিমধ্যে না থাকে। আপনি আপাতত "অনুমোদিত জাভাস্ক্রিপ্ট অরিজিনস" এবং "অনুমোদিত রিডাইরেক্ট ইউআরআই" ক্ষেত্রগুলিকে উপেক্ষা করতে পারেন৷ এই ক্লায়েন্ট আইডিটি আপনার ব্যাকএন্ড সার্ভার সনাক্ত করতে ব্যবহার করা হবে যখন এটি Google এর প্রমাণীকরণ পরিষেবাগুলির সাথে যোগাযোগ করবে৷
    1. যান .
    2. ক্লায়েন্ট তৈরি করুন ক্লিক করুন।
    3. ওয়েব অ্যাপ্লিকেশন টাইপ নির্বাচন করুন।

নির্ভরতা ঘোষণা করুন

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

dependencies {
  // ... other dependencies

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

ব্যবহারকারীর ক্রিয়াকলাপের জন্য প্রয়োজনীয় অনুমতির অনুরোধ করুন

যখনই একজন ব্যবহারকারী এমন একটি কাজ করেন যার জন্য অতিরিক্ত সুযোগের প্রয়োজন হয়, তখন AuthorizationClient.authorize() কল করুন। উদাহরণস্বরূপ, যদি একজন ব্যবহারকারী এমন একটি কাজ করেন যার জন্য তাদের ড্রাইভ অ্যাপ স্টোরেজ অ্যাক্সেসের প্রয়োজন হয়, তাহলে নিম্নলিখিতগুলি করুন:

কোটলিন

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.launchIntentSenderRequest.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 সংজ্ঞায়িত করার সময়, নিম্নলিখিত স্নিপেটে দেখানো প্রতিক্রিয়াটি পরিচালনা করুন, যেখানে আমরা অনুমান করি এটি একটি খণ্ডে করা হয়েছে। কোডটি পরীক্ষা করে যে প্রয়োজনীয় অনুমতিগুলি সফলভাবে মঞ্জুর করা হয়েছে এবং তারপর ব্যবহারকারীর ক্রিয়া সম্পাদন করে৷

কোটলিন

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 (ApiException e) {
                // 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 APIs অ্যাক্সেস করেন, তাহলে একটি অনুমোদনের কোড পেতে AuthorizationResult থেকে getServerAuthCode() পদ্ধতিতে কল করুন যা আপনি একটি অ্যাক্সেসের বিনিময়ে এবং রিফ্রেশ টোকেনের জন্য আপনার ব্যাকএন্ডে পাঠান। আরও জানতে, ব্যবহারকারীর ডেটাতে চলমান অ্যাক্সেস বজায় রাখুন দেখুন।

ব্যবহারকারীর ডেটা বা সংস্থানগুলির অনুমতি প্রত্যাহার করুন৷

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

কোটলিন

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 সরিয়ে দেয়:

কোটলিন

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

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

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

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

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

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

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

ব্যবহারকারীর ডেটাতে চলমান অ্যাক্সেস বজায় রাখুন

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

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

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

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

কোটলিন

// 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.launchIntentSenderRequest.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"));

নিম্নলিখিত স্নিপেট অনুমান করে যে অনুমোদনটি একটি খণ্ড থেকে শুরু হয়েছে।

কোটলিন

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
                }
            });
}