Telefon numaralarını otomatik olarak doğrulamak için doğrulama akışının hem istemci hem de sunucu bölümlerini uygulamanız gerekir. Bu belgede, bir Android uygulamasında istemci bölümünün nasıl uygulanacağı açıklanmaktadır.
Bir Android uygulamasında telefon numarası doğrulama akışını başlatmak için, telefon numarasını doğrulama sunucunuza gönderir ve uygulamanız için tek seferlik bir kod içeren SMS mesajını dinlemeye başlamak üzere SMS Retriever API'yi çağırırsınız. İletiyi aldıktan sonra, doğrulama işlemini tamamlamak için tek seferlik kodu sunucunuza geri gönderirsiniz.
Başlamadan önce
Uygulamanızı hazırlamak için aşağıdaki bölümlerde verilen 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 sonraki bir minSdkVersion sürümü
- derlenmişSdkVersion 28 veya daha yüksek bir sürüm
Uygulamanızı yapılandırma
Proje düzeyindeki build.gradle dosyanıza, hem buildscript
hem de allprojects
bölümlerinize Google'ın Maven deposunu ve Maven merkezi deposunu ekleyin:
buildscript {
repositories {
google()
mavenCentral()
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
SMS Retriever API için Google Play Hizmetleri bağımlılığını modülünüzün Gradle derleme dosyasına ekleyin. Bu dosya genellikle app/build.gradle
olur:
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ı alma
Kullanıcının telefon numarasını uygulamanız için uygun olan yöntemle edinebilirsiniz. Genellikle en iyi kullanıcı deneyimi, kullanıcıdan cihazda depolanan telefon numaraları arasından seçim yapmasını istemek ve böylece manuel olarak telefon numarası yazmak zorunda kalmamak için ipucu seçiciyi kullanmaktır. İ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şlatın
Kullanıcının telefon numarasını doğrulamaya hazır olduğunuzda SmsRetrieverClient
nesnesinin bir örneğini alın, startSmsRetriever
öğesini arayın ve SMS alma görevine başarı ve başarısızlık işleyicilerini ekleyin:
// 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, uygulamanızı tanımlayan benzersiz bir dize içeren SMS mesajlarını beş dakikaya kadar dinler.
3. Telefon numarasını sunucunuza gönderin
Kullanıcının telefon numarasını edindikten ve SMS mesajlarını dinlemeye başladıktan sonra, herhangi bir yöntemi kullanarak (genellikle HTTPS POST isteği ile) kullanıcının telefon numarasını doğrulama sunucunuza gönderin.
Sunucunuz bir doğrulama iletisi oluşturur ve bu iletiyi, belirttiğiniz telefon numarasına SMS ile gönderir. Sunucuda SMS Doğrulaması gerçekleştirme başlıklı makaleye bakın.
4. Doğrulama mesajlarını al
Kullanıcının cihazına bir doğrulama mesajı alındığında Play Hizmetleri, uygulamanıza açık bir şekilde mesaj metnini içeren bir SmsRetriever.SMS_RETRIEVED_ACTION
Niyeti yayınlar. Bu doğrulama mesajını almak için BroadcastReceiver
kullanın.
BroadcastReceiver
'in onReceive
işleyicisinde, Intent'in ekstralarından doğrulama mesajının metnini (ve isteğe bağlı olarak gönderen adresini) alın:
/**
* 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 aşağıdaki örnekte olduğu gibi uygulamanızın AndroidManifest.xml
dosyasında com.google.android.gms.auth.api.phone.SMS_RETRIEVED
amaç filtresi (SmsRetriever.SMS_RETRIEVED_ACTION
sabit değeri) ve com.google.android.gms.auth.api.phone.permission.SEND
izni (SmsRetriever.SEND_PERMISSION
sabit değerinin değeri) ile kaydedin veya dinamik olarak Context.registerReceiver
kodunu kullanarak kaydedin.
<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 iletisindeki tek seferlik kodu sunucunuza gönderin
Doğrulama mesajı metnine sahip olduğunuza göre, mesajdan tek seferlik kodu almak için normal ifade veya başka bir mantık kullanabilirsiniz. Tek seferlik kodun biçimi, kodu sunucunuza nasıl uyguladığınıza bağlıdır.
Son olarak, tek kullanımlık kodu sunucunuza güvenli bir bağlantı üzerinden gönderin. Sunucunuz tek seferlik kodu aldığında telefon numarasının doğrulanmış olduğunu kaydeder.