ব্যবহারকারীদের তাদের সংরক্ষিত শংসাপত্র দিয়ে সাইন ইন করুন

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

এক-ট্যাপ সাইন-ইন UI

ক্রেডেনশিয়াল সফলভাবে সংগ্রহ করা হলে, আপনি সেগুলি ব্যবহার করে ব্যবহারকারীকে আপনার অ্যাপে নির্বিঘ্নে সাইন ইন করাতে পারবেন।

যদি ব্যবহারকারী কোনো পরিচয়পত্র সংরক্ষণ না করে থাকেন, তাহলে কোনো ইউজার ইন্টারফেস (UI) প্রদর্শিত হবে না এবং আপনি স্বাভাবিক সাইন-আউট করা অভিজ্ঞতা প্রদান করতে পারবেন।

আমি ওয়ান ট্যাপ সাইন-ইন কোথায় ব্যবহার করব?

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

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

উপরে উল্লিখিত কারণগুলোর জন্য, সাইন-ইন ঐচ্ছিক অ্যাপগুলোরও তাদের সাইন-ইন স্ক্রিনে ওয়ান ট্যাপ সাইন-ইন ব্যবহার করা উচিত।

শুরু করার আগে

১. ওয়ান ট্যাপ সাইন-ইন ক্লায়েন্ট কনফিগার করুন

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

আপনার অ্যাপে যদি পাসওয়ার্ড-ভিত্তিক সাইন-ইন ব্যবহার করা হয়, তাহলে পাসওয়ার্ড ক্রেডেনশিয়াল রিকোয়েস্ট চালু করতে setPasswordRequestOptions() ব্যবহার করুন।

আপনার অ্যাপ যদি গুগল সাইন-ইন ব্যবহার করে, তাহলে গুগল আইডি টোকেন অনুরোধগুলি সক্রিয় ও কনফিগার করতে setGoogleIdTokenRequestOptions() ব্যবহার করুন:

  • গুগল এপিআই কনসোলে আপনার তৈরি করা আইডিটি সার্ভার ক্লায়েন্ট আইডি হিসেবে সেট করুন। মনে রাখবেন, এটি আপনার সার্ভারের ক্লায়েন্ট আইডি, আপনার অ্যান্ড্রয়েড ক্লায়েন্ট আইডি নয়।

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

  • সম্ভব হলে ব্যবহারকারীদের স্বয়ংক্রিয়ভাবে সাইন ইন করাতে চাইলে, setAutoSelectEnabled() ব্যবহার করে ফিচারটি সক্রিয় করুন। নিম্নলিখিত শর্তগুলো পূরণ হলে স্বয়ংক্রিয় সাইন-ইন সম্ভব হয়:

    • ব্যবহারকারীর আপনার অ্যাপের জন্য ঠিক একটিই ক্রেডেনশিয়াল সেভ করা আছে। অর্থাৎ, একটি সেভ করা পাসওয়ার্ড অথবা একটি সেভ করা গুগল অ্যাকাউন্ট।
    • ব্যবহারকারী তার গুগল অ্যাকাউন্ট সেটিংসে স্বয়ংক্রিয় সাইন-ইন নিষ্ক্রিয় করেননি।
  • যদিও এটি ঐচ্ছিক, আমরা সাইন-ইন নিরাপত্তা উন্নত করতে এবং রিপ্লে অ্যাটাক এড়াতে একটি ননস (nonce) ব্যবহার করার বিষয়টি জোরালোভাবে বিবেচনা করার জন্য সুপারিশ করি। প্রতিটি অনুরোধে একটি ননস অন্তর্ভুক্ত করতে setNonce ব্যবহার করুন। ননস তৈরি করার বিষয়ে পরামর্শ এবং অতিরিক্ত বিবরণের জন্য SafetyNet-এর ' Obtain a nonce' বিভাগটি দেখুন।

জাভা

public class YourActivity extends AppCompatActivity {
  // ...

  private SignInClient oneTapClient;
  private BeginSignInRequest signInRequest;

  @Override
  public void onCreate(@Nullable Bundle savedInstanceState,
                       @Nullable PersistableBundle persistentState) {
      super.onCreate(savedInstanceState, persistentState);

      oneTapClient = Identity.getSignInClient(this);
      signInRequest = BeginSignInRequest.builder()
              .setPasswordRequestOptions(PasswordRequestOptions.builder()
                      .setSupported(true)
                      .build())
              .setGoogleIdTokenRequestOptions(GoogleIdTokenRequestOptions.builder()
                      .setSupported(true)
                      // Your server's client ID, not your Android client ID.
                      .setServerClientId(getString(R.string.default_web_client_id))
                      // Only show accounts previously used to sign in.
                      .setFilterByAuthorizedAccounts(true)
                      .build())
              // Automatically sign in when exactly one credential is retrieved.
              .setAutoSelectEnabled(true)
              .build();
      // ...
  }
  // ...
}

কোটলিন

class YourActivity : AppCompatActivity() {
    // ...

    private lateinit var oneTapClient: SignInClient
    private lateinit var signInRequest: BeginSignInRequest

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        oneTapClient = Identity.getSignInClient(this)
        signInRequest = BeginSignInRequest.builder()
            .setPasswordRequestOptions(BeginSignInRequest.PasswordRequestOptions.builder()
                .setSupported(true)
                .build())
            .setGoogleIdTokenRequestOptions(
                BeginSignInRequest.GoogleIdTokenRequestOptions.builder()
                    .setSupported(true)
                    // Your server's client ID, not your Android client ID.
                    .setServerClientId(getString(R.string.your_web_client_id))
                    // Only show accounts previously used to sign in.
                    .setFilterByAuthorizedAccounts(true)
                    .build())
            // Automatically sign in when exactly one credential is retrieved.
            .setAutoSelectEnabled(true)
            .build()
        // ...
    }
    // ...
}

২. সাইন-ইন করা ব্যবহারকারী আছে কিনা যাচাই করুন।

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

ব্যবহারকারী প্রম্পটটি বন্ধ করে বা এর বাইরে ট্যাপ করে ওয়ান ট্যাপ সাইন-ইন ব্যবহার করতে ইতোমধ্যেই অস্বীকৃতি জানিয়েছেন কিনা, সেদিকেও আপনার নজর রাখা উচিত। এটি আপনার অ্যাক্টিভিটির একটি বুলিয়ান প্রপার্টির মতোই সহজ হতে পারে। (নিচে ‘ওয়ান ট্যাপ UI প্রদর্শন বন্ধ করুন’ দেখুন।)

৩. ওয়ান ট্যাপ সাইন-ইন UI প্রদর্শন করুন।

যদি ব্যবহারকারী সাইন ইন না করে থাকেন এবং ওয়ান ট্যাপ সাইন-ইন ব্যবহার করতে আগে থেকেই অস্বীকৃতি না জানিয়ে থাকেন, তাহলে ক্লায়েন্ট অবজেক্টের beginSignIn() মেথডটি কল করুন এবং এর থেকে প্রাপ্ত Task টিতে লিসেনার সংযুক্ত করুন। অ্যাপগুলো সাধারণত অ্যাক্টিভিটির onCreate() মেথডে অথবা একক-অ্যাক্টিভিটি আর্কিটেকচার ব্যবহার করার সময় স্ক্রিন ট্রানজিশনের পরে এই কাজটি করে থাকে।

ব্যবহারকারীর যদি আপনার অ্যাপের জন্য কোনো সংরক্ষিত ক্রেডেনশিয়াল থাকে, তাহলে ওয়ান ট্যাপ ক্লায়েন্ট সাকসেস লিসেনারকে কল করবে। সাকসেস লিসেনারে, Task রেজাল্ট থেকে পেন্ডিং ইন্টেন্টটি নিন এবং ওয়ান ট্যাপ সাইন-ইন UI শুরু করার জন্য এটিকে startIntentSenderForResult() এ পাস করুন।

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

জাভা

oneTapClient.beginSignIn(signUpRequest)
        .addOnSuccessListener(this, new OnSuccessListener<BeginSignInResult>() {
            @Override
            public void onSuccess(BeginSignInResult result) {
                try {
                    startIntentSenderForResult(
                            result.getPendingIntent().getIntentSender(), REQ_ONE_TAP,
                            null, 0, 0, 0);
                } catch (IntentSender.SendIntentException e) {
                    Log.e(TAG, "Couldn't start One Tap UI: " + e.getLocalizedMessage());
                }
            }
        })
        .addOnFailureListener(this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                // No saved credentials found. Launch the One Tap sign-up flow, or
                // do nothing and continue presenting the signed-out UI.
                Log.d(TAG, e.getLocalizedMessage());
            }
        });

কোটলিন

oneTapClient.beginSignIn(signInRequest)
    .addOnSuccessListener(this) { result ->
        try {
            startIntentSenderForResult(
                result.pendingIntent.intentSender, REQ_ONE_TAP,
                null, 0, 0, 0, null)
        } catch (e: IntentSender.SendIntentException) {
            Log.e(TAG, "Couldn't start One Tap UI: ${e.localizedMessage}")
        }
    }
    .addOnFailureListener(this) { e ->
        // No saved credentials found. Launch the One Tap sign-up flow, or
        // do nothing and continue presenting the signed-out UI.
        Log.d(TAG, e.localizedMessage)
    }

৪. ব্যবহারকারীর প্রতিক্রিয়া পরিচালনা করুন

ওয়ান ট্যাপ সাইন-ইন প্রম্পটে ব্যবহারকারীর প্রতিক্রিয়া আপনার অ্যাক্টিভিটির onActivityResult() মেথড ব্যবহার করে আপনার অ্যাপে জানানো হবে। যদি ব্যবহারকারী সাইন ইন করতে চান, তাহলে ফলাফল হিসেবে একটি সংরক্ষিত ক্রেডেনশিয়াল পাওয়া যাবে। যদি ব্যবহারকারী ওয়ান ট্যাপ UI বন্ধ করে বা এর বাইরে ট্যাপ করে সাইন ইন করতে অস্বীকার করেন, তাহলে ফলাফল হিসেবে RESULT_CANCELED কোডটি আসবে। আপনার অ্যাপকে এই উভয় পরিস্থিতিই সামাল দিতে হবে।

সংগৃহীত পরিচয়পত্র দিয়ে সাইন ইন করুন

যদি ব্যবহারকারী আপনার অ্যাপের সাথে ক্রেডেনশিয়াল শেয়ার করার সিদ্ধান্ত নিয়ে থাকেন, তাহলে আপনি onActivityResult() থেকে ইন্টেন্ট ডেটা One Tap ক্লায়েন্টের getSignInCredentialFromIntent() মেথডে পাস করে সেগুলো পুনরুদ্ধার করতে পারেন। যদি ব্যবহারকারী আপনার অ্যাপের সাথে একটি গুগল অ্যাকাউন্ট ক্রেডেনশিয়াল শেয়ার করে থাকেন, তাহলে ক্রেডেনশিয়ালটিতে একটি নন-নাল googleIdToken প্রপার্টি থাকবে, অথবা যদি ব্যবহারকারী একটি সংরক্ষিত পাসওয়ার্ড শেয়ার করে থাকেন, তাহলে একটি নন-নাল password প্রপার্টি থাকবে।

আপনার অ্যাপের ব্যাকএন্ডে প্রমাণীকরণের জন্য পরিচয়পত্রটি ব্যবহার করুন।

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

জাভা

public class YourActivity extends AppCompatActivity {

  // ...
  private static final int REQ_ONE_TAP = 2;  // Can be any integer unique to the Activity.
  private boolean showOneTapUI = true;
  // ...

  @Override
  protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
      super.onActivityResult(requestCode, resultCode, data);

      switch (requestCode) {
          case REQ_ONE_TAP:
              try {
                  SignInCredential credential = oneTapClient.getSignInCredentialFromIntent(data);
                  String idToken = credential.getGoogleIdToken();
                  String username = credential.getId();
                  String password = credential.getPassword();
                  if (idToken !=  null) {
                      // Got an ID token from Google. Use it to authenticate
                      // with your backend.
                      Log.d(TAG, "Got ID token.");
                  } else if (password != null) {
                      // Got a saved username and password. Use them to authenticate
                      // with your backend.
                      Log.d(TAG, "Got password.");
                  }
              } catch (ApiException e) {
                  // ...
              }
              break;
      }
  }
}

কোটলিন

class YourActivity : AppCompatActivity() {

    // ...
    private val REQ_ONE_TAP = 2  // Can be any integer unique to the Activity
    private var showOneTapUI = true
    // ...

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        when (requestCode) {
             REQ_ONE_TAP -> {
                try {
                    val credential = oneTapClient.getSignInCredentialFromIntent(data)
                    val idToken = credential.googleIdToken
                    val username = credential.id
                    val password = credential.password
                    when {
                        idToken != null -> {
                            // Got an ID token from Google. Use it to authenticate
                            // with your backend.
                            Log.d(TAG, "Got ID token.")
                        }
                        password != null -> {
                            // Got a saved username and password. Use them to authenticate
                            // with your backend.
                            Log.d(TAG, "Got password.")
                        }
                        else -> {
                            // Shouldn't happen.
                            Log.d(TAG, "No ID token or password!")
                        }
                    }
                } catch (e: ApiException) {
                    // ...
                }
            }
        }
    }
    // ...
}

ওয়ান ট্যাপ UI প্রদর্শন বন্ধ করুন

যদি ব্যবহারকারী সাইন ইন করতে অস্বীকার করেন, তাহলে getSignInCredentialFromIntent() কলটি CommonStatusCodes.CANCELED স্ট্যাটাস কোড সহ একটি ApiException থ্রো করবে। যখন এমনটা ঘটে, তখন আপনার ওয়ান ট্যাপ সাইন-ইন UI সাময়িকভাবে নিষ্ক্রিয় করা উচিত, যাতে বারবার প্রম্পট করে ব্যবহারকারীদের বিরক্ত না করা হয়। নিম্নলিখিত উদাহরণটি অ্যাক্টিভিটিতে একটি প্রপার্টি সেট করার মাধ্যমে এটি সম্পন্ন করে, যা ব্যবহারকারীকে ওয়ান ট্যাপ সাইন-ইন অফার করা হবে কিনা তা নির্ধারণ করতে ব্যবহৃত হয়; তবে, আপনি SharedPreferences এ একটি মান সংরক্ষণ করতে বা অন্য কোনো পদ্ধতিও ব্যবহার করতে পারেন।

ওয়ান ট্যাপ সাইন-ইন প্রম্পটের জন্য আপনার নিজস্ব রেট লিমিটিং প্রয়োগ করা জরুরি। যদি আপনি তা না করেন এবং কোনো ব্যবহারকারী পরপর বেশ কয়েকটি প্রম্পট বাতিল করে দেন, তাহলে ওয়ান ট্যাপ ক্লায়েন্ট পরবর্তী ২৪ ঘণ্টার জন্য তাকে আর কোনো প্রম্পট দেখাবে না।

জাভা

public class YourActivity extends AppCompatActivity {

  // ...
  private static final int REQ_ONE_TAP = 2;  // Can be any integer unique to the Activity.
  private boolean showOneTapUI = true;
  // ...

  @Override
  protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
      super.onActivityResult(requestCode, resultCode, data);

      switch (requestCode) {
          case REQ_ONE_TAP:
              try {
                  // ...
              } catch (ApiException e) {
                  switch (e.getStatusCode()) {
                      case CommonStatusCodes.CANCELED:
                          Log.d(TAG, "One-tap dialog was closed.");
                          // Don't re-prompt the user.
                          showOneTapUI = false;
                          break;
                      case CommonStatusCodes.NETWORK_ERROR:
                          Log.d(TAG, "One-tap encountered a network error.");
                          // Try again or just ignore.
                          break;
                      default:
                          Log.d(TAG, "Couldn't get credential from result."
                                  + e.getLocalizedMessage());
                          break;
                  }
              }
              break;
      }
  }
}

কোটলিন

class YourActivity : AppCompatActivity() {

    // ...
    private val REQ_ONE_TAP = 2  // Can be any integer unique to the Activity
    private var showOneTapUI = true
    // ...

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        when (requestCode) {
            REQ_ONE_TAP -> {
                try {
                    // ...
                } catch (e: ApiException) {
                    when (e.statusCode) {
                        CommonStatusCodes.CANCELED -> {
                            Log.d(TAG, "One-tap dialog was closed.")
                            // Don't re-prompt the user.
                            showOneTapUI = false
                        }
                        CommonStatusCodes.NETWORK_ERROR -> {
                            Log.d(TAG, "One-tap encountered a network error.")
                            // Try again or just ignore.
                        }
                        else -> {
                            Log.d(TAG, "Couldn't get credential from result." +
                                " (${e.localizedMessage})")
                        }
                    }
                }
            }
        }
    }
    // ...
}

৫. সাইন-আউট পরিচালনা করুন

যখন কোনো ব্যবহারকারী আপনার অ্যাপ থেকে সাইন আউট করেন, তখন ওয়ান ট্যাপ ক্লায়েন্টের signOut() মেথডটি কল করুন। signOut() কল করলে, ব্যবহারকারী পুনরায় সাইন ইন না করা পর্যন্ত স্বয়ংক্রিয় সাইন-ইন নিষ্ক্রিয় হয়ে যায়।

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

পরবর্তী পদক্ষেপ

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

আপনি যদি গুগল সাইন-ইন সমর্থন করেন, তাহলে আপনার অ্যাপে ঝামেলাহীন অ্যাকাউন্ট তৈরির প্রক্রিয়া যোগ করতে ওয়ান ট্যাপ ক্লায়েন্টও ব্যবহার করতে পারেন।