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

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

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

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

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

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

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

আপনার সেট আপ করুন Google Cloud Console প্রকল্প

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

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

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

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

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

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

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

ব্যর্থ যাচাইকরণ ঠিক করতে, নিম্নলিখিতগুলি চেষ্টা করে দেখুন:

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

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

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

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

কোটলিন

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

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

পূর্বে প্রদত্ত অ্যাক্সেস প্রত্যাহার করতে, AuthorizationClient.revokeAccess() কল করুন। উদাহরণস্বরূপ, যদি ব্যবহারকারী আপনার অ্যাপ থেকে তাদের অ্যাকাউন্টটি সরিয়ে ফেলেন এবং আপনার অ্যাপটিকে পূর্বে DriveScopes.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-এ ফর্ম্যাট করা হয়েছে।

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

যদি আপনি প্রমাণীকরণের জন্য Credential Manager ব্যবহার করেন এবং AuthorizationClient.authorize() চালান, তাহলে আপনার অ্যাপের ডিফল্ট অ্যাকাউন্টটি আপনার ব্যবহারকারীর দ্বারা নির্বাচিত অ্যাকাউন্টে সেট করা হবে। এর অর্থ হল অনুমোদনের জন্য পরবর্তী যেকোনো কল এই ডিফল্ট অ্যাকাউন্টটি ব্যবহার করবে। অ্যাকাউন্ট নির্বাচককে জোর করে দেখানোর জন্য, Credential Manager থেকে 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.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"));

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

কোটলিন

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