Android Uygulamasında SMS Doğrulaması İsteme

Telefon numaralarını otomatik olarak doğrulamak için hem istemci hem de emin olmanız gerekir. Bu belgede, istemci bölümünü bir Android uygulamasında uygulamalısınız.

Bir Android uygulamasında telefon numarası doğrulama akışını başlatmak için doğrulama sunucunuza telefon numaranızı gönderin ve başlamak için SMS Retriever API'yi arayın uygulamanız için tek kullanımlık kod içeren bir SMS mesajı dinliyor. Siz mesajı aldıktan sonra, doğrulama işlemini tamamlaması için tek seferlik kodu sunucunuza geri adımları uygulayın.

Başlamadan önce

Uygulamanızı hazırlamak için aşağıdaki bölümlerde yer alan adımları tamamlayın.

Uygulama ön koşulları

Uygulamanızın derleme dosyasının aşağıdaki değerleri kullandığından emin olun:

  • 19 veya daha yüksek bir minSdkVersion
  • 28 veya daha yüksek bir çalışınSdkVersion

Uygulamanızı yapılandırma

Proje düzeyindeki build.gradle dosyanıza Google'ın Maven deposunu ekleyin. ve Maven merkez deposu hem buildscript hem de allprojects bölümlerinizde:

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

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

Google Play Hizmetleri bağımlılığını ekleyin SMS Retriever API için modülünüzün Gradle derleme dosyasına: ve genellikle app/build.gradle:

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

1. Kullanıcının telefon numarasını edinme

Kullanıcının telefon numarasını, size uygun olan herhangi bir yolla alabilirsiniz. uygulamasını indirin. Genellikle en iyi kullanıcı deneyimi, cihazda depolanan telefon numaraları arasından seçim yapmasını ve böylece bir telefon numarası girmeniz gerekiyor. İpucu seçiciyi kullanmak için:

// 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 retriever'ı başlatma

Kullanıcının telefon numarasını doğrulamaya hazır olduğunuzda SmsRetrieverClient nesnesini, startSmsRetriever çağrısını yapın ve başarı ve hata dinleyicileri SMS alma görevi için:

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

SMS alma görevi, bir SMS mesajını beş dakikaya kadar dinler bir dize ekleyin.

3. Telefon numarasını sunucunuza gönderin

Kullanıcının telefon numarasını aldıktan ve SMS'i dinlemeye başladıktan sonra kullanıcının telefon numarasını, herhangi bir yöntemini (genellikle bir HTTPS POST isteği ile) kullanır.

Sunucunuz bir doğrulama mesajı oluşturur ve bu mesajı telefona SMS ile gönderir ekleyebilirsiniz. Sunucuda SMS Doğrulaması Gerçekleştirme başlıklı makaleye bakın.

4. Doğrulama mesajlarını alma

Kullanıcının cihazında bir doğrulama mesajı alındığında Play Hizmetleri, uygulamanızda açıkça bir SmsRetriever.SMS_RETRIEVED_ACTION Niyeti yayınlarsa, girin. Almak için BroadcastReceiver kullanın bu doğrulama mesajını gönderin.

BroadcastReceiver öğesinin onReceive işleyicisinde doğrulama iletisi (ve isteğe bağlı olarak gönderen adresini) ekstralar:

/**
 * 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;
      }
    }
  }
}

Bu BroadcastReceiver öğesini intent filtresiyle kaydedin com.google.android.gms.auth.api.phone.SMS_RETRIEVED ( SmsRetriever.SMS_RETRIEVED_ACTION sabiti) ve izin com.google.android.gms.auth.api.phone.permission.SEND ( SmsRetriever.SEND_PERMISSION sabit)AndroidManifest.xml dosyasını kullanarak dinamik bir şekilde Context.registerReceiver kullanabilirsiniz.

<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. Doğrulama mesajındaki tek seferlik kodu sunucunuza gönderin

Doğrulama iletisi metnini öğrendiğinize göre artık normal ifade veya başka bir mantık kullanarak mesajdan tek seferlik kod alabilirsiniz. Etiketin biçimi tek kullanımlık kodlar, onları sunucunuzda nasıl uyguladığınıza bağlıdır.

Son olarak, tek seferlik kodu sunucunuza güvenli bir bağlantı üzerinden gönderin. Zaman sunucu bir defalık kodu alırsa, telefon numarasında bulunan doğrulandı.