Android ऐप्लिकेशन में मैसेज (एसएमएस) की मदद से पुष्टि करने का अनुरोध करना

फ़ोन नंबर की अपने-आप पुष्टि होने की सुविधा के लिए, आपको पुष्टि करने की प्रोसेस के क्लाइंट और सर्वर, दोनों हिस्सों को लागू करना होगा. इस दस्तावेज़ में, Android ऐप्लिकेशन में क्लाइंट के हिस्से को लागू करने का तरीका बताया गया है.

Android ऐप्लिकेशन में फ़ोन नंबर की पुष्टि करने की प्रोसेस शुरू करने के लिए, फ़ोन नंबर को पुष्टि करने वाले सर्वर पर भेजें. इसके बाद, SMS Retriever API को कॉल करें, ताकि आपके ऐप्लिकेशन के लिए एक बार इस्तेमाल किया जा सकने वाला कोड पाने के लिए एसएमएस मैसेज सुनना शुरू किया जा सके. मैसेज मिलने के बाद, पुष्टि की प्रोसेस पूरी करने के लिए, एक बार इस्तेमाल किया जा सकने वाला कोड वापस अपने सर्वर पर भेजें.

अपने ऐप्लिकेशन को तैयार करने के लिए, यहां दिए गए सेक्शन में बताया गया तरीका अपनाएं.

ऐप्लिकेशन से जुड़ी ज़रूरी शर्तें

पक्का करें कि आपके ऐप्लिकेशन की बिल्ड फ़ाइल में इन वैल्यू का इस्तेमाल किया गया हो:

  • minSdkVersion 19 या इसके बाद का वर्शन
  • compileSdkVersion 28 या इससे ज़्यादा होना चाहिए

अपने ऐप्लिकेशन को कॉन्फ़िगर करना

अपने प्रोजेक्ट-लेवल की build.gradle फ़ाइल में, Google की Maven रिपॉज़िटरी और Maven Central रिपॉज़िटरी को अपने buildscript और allprojects, दोनों सेक्शन में शामिल करें:

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

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

एसएमएस रीट्रिवर एपीआई के लिए, Google Play services की डिपेंडेंसी को अपनी मॉड्यूल की Gradle बिल्ड फ़ाइल में जोड़ें. आम तौर पर, यह app/build.gradle होती है:

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

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. एसएमएस रिट्रीवर शुरू करना

जब आपको उपयोगकर्ता के फ़ोन नंबर की पुष्टि करनी हो, तब 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. फ़ोन नंबर को अपने सर्वर पर भेजें

उपयोगकर्ता का फ़ोन नंबर पाने और एसएमएस मैसेज सुनने की सुविधा चालू करने के बाद, उपयोगकर्ता का फ़ोन नंबर अपने पुष्टि करने वाले सर्वर को भेजें. इसके लिए, किसी भी तरीके का इस्तेमाल किया जा सकता है. आम तौर पर, एचटीटीपीएस पोस्ट अनुरोध का इस्तेमाल किया जाता है.

आपका सर्वर, पुष्टि करने वाला मैसेज जनरेट करता है और उसे आपके दिए गए फ़ोन नंबर पर एसएमएस के ज़रिए भेजता है. सर्वर पर एसएमएस की पुष्टि करना लेख पढ़ें.

4. पुष्टि करने के लिए मैसेज पाना

जब उपयोगकर्ता के डिवाइस पर पुष्टि करने वाला मैसेज मिलता है, तब Play services आपके ऐप्लिकेशन को 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:
          // (Optional) Get SMS Sender address - only available in
          // GMS version 24.20 onwards, else it will return null
          String senderAddress = extras.getString(SmsRetriever.EXTRA_SMS_ORIGINATING_ADDRESS);
          // Get SMS message contents
          String message = extras.getString(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;
      }
    }
  }
}

अपने ऐप्लिकेशन की AndroidManifest.xml फ़ाइल में, इस BroadcastReceiver को इंटेंट फ़िल्टर com.google.android.gms.auth.api.phone.SMS_RETRIEVED (SmsRetriever.SMS_RETRIEVED_ACTION कॉन्स्टेंट की वैल्यू) और अनुमति com.google.android.gms.auth.api.phone.permission.SEND (SmsRetriever.SEND_PERMISSION कॉन्स्टेंट की वैल्यू) के साथ रजिस्टर करें. इसके लिए, यहां दिया गया उदाहरण देखें या 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. पुष्टि करने वाले मैसेज से, एक बार इस्तेमाल होने वाला कोड अपने सर्वर पर भेजें

पुष्टि करने वाले मैसेज का टेक्स्ट मिलने के बाद, मैसेज से एक बार इस्तेमाल किया जा सकने वाला कोड पाने के लिए, रेगुलर एक्सप्रेशन या किसी अन्य लॉजिक का इस्तेमाल करें. एक बार इस्तेमाल किया जा सकने वाला कोड किस फ़ॉर्मैट में होगा, यह इस बात पर निर्भर करता है कि आपने उन्हें अपने सर्वर में कैसे लागू किया है.

आखिर में, एक बार इस्तेमाल होने वाला कोड, सुरक्षित कनेक्शन के ज़रिए अपने सर्वर पर भेजें. जब आपके सर्वर को एक बार इस्तेमाल होने वाला कोड मिलता है, तो वह रिकॉर्ड करता है कि फ़ोन नंबर की पुष्टि हो गई है.