এক ট্যাপ দিয়ে নতুন অ্যাকাউন্ট তৈরি করুন

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

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

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

ওয়ান ট্যাপ অ্যাকাউন্ট তৈরির দুটি অংশ রয়েছে:

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

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

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

তুমি শুরু করার আগে

One Tap সাইন-ইন দিয়ে শুরু করুন- এ বর্ণিত আপনার Google APIs কনসোল প্রকল্প এবং Android প্রকল্প সেট আপ করুন।

1. ওয়ান ট্যাপ ক্লায়েন্ট কনফিগার করুন

অ্যাকাউন্ট তৈরির জন্য ওয়ান ট্যাপ ক্লায়েন্ট কনফিগার করতে, নিম্নলিখিতগুলি করুন:

  • পাসওয়ার্ড শংসাপত্রের অনুরোধগুলি সক্ষম করবেন না। (এক-ট্যাপ সাইন-আপ শুধুমাত্র টোকেন-ভিত্তিক প্রমাণীকরণের সাথে সম্ভব।)
  • setGoogleIdTokenRequestOptions() এবং এই সেটিংস ব্যবহার করে Google ID টোকেন অনুরোধগুলি সক্ষম করুন:

    • Google APIs কনসোলে আপনার তৈরি করা আইডিতে সার্ভার ক্লায়েন্ট আইডি সেট করুন। মনে রাখবেন এটি আপনার সার্ভারের ক্লায়েন্ট আইডি, আপনার অ্যান্ড্রয়েড ক্লায়েন্ট আইডি নয়।
    • ডিভাইসে সমস্ত Google অ্যাকাউন্ট দেখানোর জন্য ক্লায়েন্টকে কনফিগার করুন—অর্থাৎ, অনুমোদিত অ্যাকাউন্ট দ্বারা ফিল্টার করবেন না।
    • ঐচ্ছিকভাবে, আপনি অ্যাকাউন্টের জন্য যাচাইকৃত ফোন নম্বরের জন্যও অনুরোধ করতে পারেন।

জাভা

public class YourActivity extends AppCompatActivity {

  // ...

  private SignInClient oneTapClient;
  private BeginSignInRequest signUpRequest;

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

      oneTapClient = Identity.getSignInClient(this);
      signUpRequest = BeginSignInRequest.builder()
              .setGoogleIdTokenRequestOptions(GoogleIdTokenRequestOptions.builder()
                      .setSupported(true)
                      // Your server's client ID, not your Android client ID.
                      .setServerClientId(getString(R.string.your_web_client_id))
                      // Show all accounts on the device.
                      .setFilterByAuthorizedAccounts(false)
                      .build())
              .build();

      // ...
  }
}

কোটলিন

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

    private lateinit var oneTapClient: SignInClient
    private lateinit var signUpRequest: BeginSignInRequest

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

        oneTapClient = Identity.getSignInClient(this)
        signUpRequest = BeginSignInRequest.builder()
            .setGoogleIdTokenRequestOptions(
                BeginSignInRequest.GoogleIdTokenRequestOptions.builder()
                    .setSupported(true)
                    // Your server's client ID, not your Android client ID.
                    .setServerClientId(getString(R.string.your_web_client_id))
                    // Show all accounts on the device.
                    .setFilterByAuthorizedAccounts(false)
                    .build())
            .build()
        // ...
    }
    // ...
}

2. One Tap UI বাতিলকরণের ট্র্যাক রাখুন৷

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

3. এক ট্যাপ সাইন আপ UI প্রদর্শন করুন৷

ব্যবহারকারী যদি একটি নতুন অ্যাকাউন্ট তৈরি করতে ওয়ান ট্যাপ ব্যবহার করতে অস্বীকার না করে থাকেন, তাহলে ক্লায়েন্ট অবজেক্টের beginSignIn() পদ্ধতিতে কল করুন এবং শ্রোতাদের এটি যে Task ফেরত দেয় তাতে সংযুক্ত করুন। অ্যাপগুলি সাধারণত এই পদক্ষেপটি করে যখন একটি ওয়ান ট্যাপ সাইন-ইন অনুরোধ কোনো সংরক্ষিত শংসাপত্র খুঁজে পায় না—অর্থাৎ সাইন -ইন অনুরোধের ব্যর্থ শ্রোতার ক্ষেত্রে।

ব্যবহারকারীর ডিভাইসে এক বা একাধিক Google অ্যাকাউন্ট সেট আপ থাকলে ওয়ান ট্যাপ ক্লায়েন্ট সফল শ্রোতাকে কল করবে। সফল শ্রোতার মধ্যে, Task ফলাফল থেকে মুলতুবি অভিপ্রায়টি পান এবং ওয়ান ট্যাপ UI শুরু করতে startIntentSenderForResult() এ পাস করুন৷

ব্যবহারকারীর ডিভাইসে কোনো Google অ্যাকাউন্ট না থাকলে, One Tap ক্লায়েন্ট ব্যর্থ শ্রোতাকে কল করবে। এই ক্ষেত্রে, কোনও পদক্ষেপের প্রয়োজন নেই: আপনি কেবল অ্যাপের সাইন-আউট অভিজ্ঞতা উপস্থাপন করা চালিয়ে যেতে পারেন এবং ব্যবহারকারী আপনার স্বাভাবিক অ্যাকাউন্ট তৈরির প্রবাহের সাথে সাইন আপ করতে পারেন।

জাভা

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 Google Accounts found. Just continue presenting the signed-out UI.
                Log.d(TAG, e.getLocalizedMessage());
            }
        });

কোটলিন

oneTapClient.beginSignIn(signUpRequest)
    .addOnSuccessListener(this) { result ->
        try {
            startIntentSenderForResult(
                result.pendingIntent.intentSender, REQ_ONE_TAP,
                null, 0, 0, 0)
        } catch (e: IntentSender.SendIntentException) {
            Log.e(TAG, "Couldn't start One Tap UI: ${e.localizedMessage}")
        }
    }
    .addOnFailureListener(this) { e ->
        // No Google Accounts found. Just continue presenting the signed-out UI.
        Log.d(TAG, e.localizedMessage)
    }

4. ব্যবহারকারীর প্রতিক্রিয়া হ্যান্ডেল

One Tap সাইন-আপ প্রম্পটে ব্যবহারকারীর প্রতিক্রিয়া আপনার অ্যাক্টিভিটির onActivityResult() পদ্ধতি ব্যবহার করে আপনার অ্যাপে রিপোর্ট করা হবে। ব্যবহারকারী যদি একটি অ্যাকাউন্ট তৈরি করতে বেছে নেন, তাহলে ফলাফলটি হবে একটি Google ID টোকেন। যদি ব্যবহারকারী সাইন আপ করতে অস্বীকার করে, হয় One Tap UI বন্ধ করে বা এর বাইরে ট্যাপ করে, ফলাফলটি RESULT_CANCELED কোডের সাথে ফিরে আসবে। আপনার অ্যাপটিকে উভয় সম্ভাবনাই পরিচালনা করতে হবে।

একটি Google ID টোকেন দিয়ে একটি অ্যাকাউন্ট তৈরি করুন

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

আপনার ব্যাকএন্ডে একটি অ্যাকাউন্ট তৈরি করতে আইডি টোকেন ব্যবহার করুন ( আইডি টোকেন ব্যবহার করে একটি ব্যাকএন্ড দিয়ে প্রমাণীকরণ দেখুন) এবং ব্যবহারকারীকে সাইন ইন করুন।

শংসাপত্রে আপনার অনুরোধ করা অতিরিক্ত বিবরণও রয়েছে, যেমন উপলব্ধ থাকলে অ্যাকাউন্টের যাচাইকৃত ফোন নম্বর।

জাভা

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();
                  if (idToken !=  null) {
                      // Got an ID token from Google. Use it to authenticate
                      // with your backend.
                      Log.d(TAG, "Got ID token.");
                  }
              } 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
                    when {
                        idToken != null -> {
                            // Got an ID token from Google. Use it to authenticate
                            // with your backend.
                            Log.d(TAG, "Got ID token.")
                        }
                        else -> {
                            // Shouldn't happen.
                            Log.d(TAG, "No ID token!")
                        }
                    }
                } catch (e: ApiException) {
                    // ...
            }
        }
    }
    // ...
}

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

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

ওয়ান ট্যাপ সাইন-ইন প্রম্পটগুলির সীমিত আপনার নিজস্ব হার বাস্তবায়ন করা গুরুত্বপূর্ণ। আপনি যদি তা না করেন, এবং একজন ব্যবহারকারী পরপর একাধিক প্রম্পট বাতিল করে, One Tap ক্লায়েন্ট পরবর্তী 24 ঘন্টার জন্য ব্যবহারকারীকে অনুরোধ করবে না।

জাভা

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

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

যখন একজন ব্যবহারকারী ওয়ান-ট্যাপ সাইন-আপ ফ্লো সম্পূর্ণ করেন, আপনি একটি Google ID টোকেন পাবেন, যার মধ্যে কিছু মৌলিক প্রোফাইল তথ্য রয়েছে: ব্যবহারকারীর ইমেল ঠিকানা, পুরো নাম এবং প্রোফাইল ছবির URL। অনেক অ্যাপের জন্য, ব্যাকএন্ডে ব্যবহারকারীকে প্রমাণীকরণ করতে এবং একটি নতুন অ্যাকাউন্ট তৈরি করতে এই তথ্যটি আপনার জন্য যথেষ্ট।

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