একটি অ্যান্ড্রয়েড অ্যাপে এসএমএস যাচাইয়ের অনুরোধ করুন

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

একটি Android অ্যাপে ফোন নম্বর যাচাইকরণ প্রবাহ শুরু করতে, আপনি আপনার যাচাইকরণ সার্ভারে ফোন নম্বর পাঠান এবং আপনার অ্যাপের জন্য একটি এককালীন কোড সহ একটি SMS বার্তা শোনা শুরু করতে SMS Retriever API-কে কল করুন৷ আপনি বার্তাটি পাওয়ার পরে, আপনি যাচাইকরণ প্রক্রিয়াটি সম্পূর্ণ করতে আপনার সার্ভারে একবারের কোডটি ফেরত পাঠান।

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

আপনার অ্যাপ প্রস্তুত করতে, নিম্নলিখিত বিভাগগুলিতে পদক্ষেপগুলি সম্পূর্ণ করুন৷

অ্যাপের পূর্বশর্ত

নিশ্চিত করুন যে আপনার অ্যাপের বিল্ড ফাইল নিম্নলিখিত মানগুলি ব্যবহার করে:

  • 19 বা তার বেশির একটি minSdk সংস্করণ
  • 28 বা উচ্চতর একটি কম্পাইলSdk সংস্করণ

আপনার অ্যাপ কনফিগার করুন

আপনার প্রজেক্ট-লেভেলের build.gradle ফাইলে, আপনার buildscript এবং allprojects উভয় বিভাগেই Google এর Maven সংগ্রহস্থল এবং Maven কেন্দ্রীয় সংগ্রহস্থল অন্তর্ভুক্ত করুন:

buildscript {
    repositories {
        google()
        mavenCentral()
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

আপনার মডিউলের Gradle বিল্ড ফাইলে SMS Retriever API-এর জন্য Google Play পরিষেবা নির্ভরতা যোগ করুন, যা সাধারণত app/build.gradle হয়:

dependencies {
  implementation 'com.google.android.gms:play-services-auth:21.0.0'
  implementation 'com.google.android.gms:play-services-auth-api-phone:18.0.2'
}

1. ব্যবহারকারীর ফোন নম্বর পান৷

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

// Construct a request for phone numbers and show the picker
private void requestHint() {
    HintRequest hintRequest = new HintRequest.Builder()
           .setPhoneNumberIdentifierSupported(true)
           .build();

    PendingIntent intent = Auth.CredentialsApi.getHintPickerIntent(
            apiClient, hintRequest);
    startIntentSenderForResult(intent.getIntentSender(),
            RESOLVE_HINT, null, 0, 0, 0);
}

// Obtain the phone number from the result
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (requestCode == RESOLVE_HINT) {
      if (resultCode == RESULT_OK) {
          Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
          // credential.getId();  <-- will need to process phone number string
      }
  }
}

2. SMS পুনরুদ্ধার শুরু করুন

আপনি যখন ব্যবহারকারীর ফোন নম্বর যাচাই করার জন্য প্রস্তুত হন, তখন SmsRetrieverClient অবজেক্টের একটি উদাহরণ পান, startSmsRetriever কল করুন এবং সফলতা ও ব্যর্থতার শ্রোতাদের এসএমএস পুনরুদ্ধারের কাজে সংযুক্ত করুন:

// Get an instance of SmsRetrieverClient, used to start listening for a matching
// SMS message.
SmsRetrieverClient client = SmsRetriever.getClient(this /* context */);

// Starts SmsRetriever, which waits for ONE matching SMS message until timeout
// (5 minutes). The matching SMS message will be sent via a Broadcast Intent with
// action SmsRetriever#SMS_RETRIEVED_ACTION.
Task<Void> task = client.startSmsRetriever();

// Listen for success/failure of the start Task. If in a background thread, this
// can be made blocking using Tasks.await(task, [timeout]);
task.addOnSuccessListener(new OnSuccessListener<Void>() {
  @Override
  public void onSuccess(Void aVoid) {
    // Successfully started retriever, expect broadcast intent
    // ...
  }
});

task.addOnFailureListener(new OnFailureListener() {
  @Override
  public void onFailure(@NonNull Exception e) {
    // Failed to start retriever, inspect Exception for more details
    // ...
  }
});

এসএমএস পুনরুদ্ধারের কাজটি একটি এসএমএস বার্তার জন্য পাঁচ মিনিট পর্যন্ত শুনবে যাতে একটি অনন্য স্ট্রিং থাকে যা আপনার অ্যাপকে সনাক্ত করে।

3. আপনার সার্ভারে ফোন নম্বর পাঠান

আপনি ব্যবহারকারীর ফোন নম্বর পাওয়ার পরে এবং SMS বার্তা শুনতে শুরু করার পরে, যে কোনও পদ্ধতি ব্যবহার করে ব্যবহারকারীর ফোন নম্বর আপনার যাচাইকরণ সার্ভারে পাঠান (সাধারণত একটি HTTPS POST অনুরোধের সাথে)।

আপনার সার্ভার একটি যাচাইকরণ বার্তা তৈরি করে এবং আপনার নির্দিষ্ট করা ফোন নম্বরে SMS এর মাধ্যমে পাঠায়৷ সার্ভারে এসএমএস যাচাইকরণ দেখুন।

4. যাচাইকরণ বার্তা পান

যখন ব্যবহারকারীর ডিভাইসে একটি যাচাইকরণ বার্তা পাওয়া যায়, তখন প্লে পরিষেবাগুলি স্পষ্টভাবে আপনার অ্যাপে একটি SmsRetriever.SMS_RETRIEVED_ACTION ইন্টেন্ট সম্প্রচার করে, যাতে বার্তাটির পাঠ্য থাকে৷ এই যাচাইকরণ বার্তাটি পেতে একটি BroadcastReceiver ব্যবহার করুন৷

BroadcastReceiver এর onReceive হ্যান্ডলারে, Intent-এর অতিরিক্ত থেকে যাচাইকরণ বার্তার পাঠ্য পান:

/**
 * BroadcastReceiver to wait for SMS messages. This can be registered either
 * in the AndroidManifest or at runtime.  Should filter Intents on
 * SmsRetriever.SMS_RETRIEVED_ACTION.
 */
public class MySMSBroadcastReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
    if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
      Bundle extras = intent.getExtras();
      Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS);

      switch(status.getStatusCode()) {
        case CommonStatusCodes.SUCCESS:
          // Get SMS message contents
          String message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE);
          // Extract one-time code from the message and complete verification
          // by sending the code back to your server.
          break;
        case CommonStatusCodes.TIMEOUT:
          // Waiting for SMS timed out (5 minutes)
          // Handle the error ...
          break;
      }
    }
  }
}

অভিপ্রায় ফিল্টার com.google.android.gms.auth.api.phone.SMS_RETRIEVED ( SmsRetriever.SMS_RETRIEVED_ACTION ধ্রুবকের মান) এবং অনুমতি com.google.android.gms.auth.api.phone.permission.SEND দিয়ে এই BroadcastReceiver নিবন্ধন করুন com.google.android.gms.auth.api.phone.permission.SEND ( SmsRetriever.SEND_PERMISSION ধ্রুবক) আপনার অ্যাপের AndroidManifest.xml ফাইলে, নিচের উদাহরণের মতো, অথবা গতিশীলভাবে Context.registerReceiver ব্যবহার করে।

<receiver android:name=".MySMSBroadcastReceiver" android:exported="true"
          android:permission="com.google.android.gms.auth.api.phone.permission.SEND">
    <intent-filter>
        <action android:name="com.google.android.gms.auth.api.phone.SMS_RETRIEVED"/>
    </intent-filter>
</receiver>

5. যাচাইকরণ বার্তা থেকে আপনার সার্ভারে এক-বারের কোড পাঠান৷

এখন আপনার কাছে যাচাইকরণ বার্তাটির পাঠ্য রয়েছে, বার্তা থেকে এককালীন কোড পেতে একটি নিয়মিত অভিব্যক্তি বা অন্য কোনো যুক্তি ব্যবহার করুন৷ এককালীন কোডের বিন্যাস নির্ভর করে আপনি কীভাবে আপনার সার্ভারে প্রয়োগ করেছেন তার উপর।

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

ঐচ্ছিক: পাসওয়ার্ডের জন্য স্মার্ট লক দিয়ে ফোন নম্বর সংরক্ষণ করুন

ঐচ্ছিকভাবে, ব্যবহারকারী তাদের ফোন নম্বর যাচাই করার পরে, আপনি ব্যবহারকারীকে এই ফোন নম্বর অ্যাকাউন্টটি পাসওয়ার্ডের জন্য Smart Lock-এর সাথে সংরক্ষণ করার জন্য অনুরোধ করতে পারেন যাতে এটি স্বয়ংক্রিয়ভাবে অন্যান্য অ্যাপে এবং অন্যান্য ডিভাইসে ফোন নম্বরটি আবার টাইপ বা নির্বাচন না করেই পাওয়া যায়। :

Credential credential = new Credential.Builder(phoneNumberString)
        .setAccountType("https://signin.example.com")  // a URL specific to the app
        .setName(displayName)  // optional: a display name if available
        .build();
Auth.CredentialsApi.save(apiClient, credential).setResultCallback(
            new ResultCallback() {
                public void onResult(Result result) {
                    Status status = result.getStatus();
                    if (status.isSuccess()) {
                        Log.d(TAG, "SAVE: OK");  // already saved
                    } else if (status.hasResolution()) {
                        // Prompt the user to save
                        status.startResolutionForResult(this, RC_SAVE);
                    }
                }
            });

তারপরে, ব্যবহারকারী অ্যাপটি পুনরায় ইনস্টল করার পরে বা একটি নতুন ডিভাইসে অ্যাপটি ইনস্টল করার পরে, আপনি ব্যবহারকারীকে তাদের ফোন নম্বরের জন্য পুনরায় জিজ্ঞাসা না করেই সংরক্ষিত ফোন নম্বরটি পুনরুদ্ধার করতে পারেন:

// On the next install, retrieve the phone number
mCredentialRequest = new CredentialRequest.Builder()
    .setAccountTypes("https://signin.example.com")  // the URL specific to the developer
    .build();
Auth.CredentialsApi.request(apiClient, mCredentialRequest).setResultCallback(
    new ResultCallback<CredentialRequestResult>() {
        public void onResult(CredentialRequestResult credentialRequestResult) {
            if (credentialRequestResult.getStatus().isSuccess()) {
                credentialRequestResult.getCredential().getId();  // this is the phone number
            }
        }
    });

// Then, initiate verification and sign the user in (same as original verification logic)