Android アプリで SMS 検証をリクエストする

電話番号を自動的に確認できるようにするには、クライアントと電話番号の両方を実装する必要があります。 確認フローのサーバー部分で行われます。このドキュメントでは、 クライアント部分を Android アプリに実装する。

Android アプリで電話番号の確認フローを開始するには、 確認サーバーに電話番号を送信し、SMS Retriever API を呼び出して開始します アプリのワンタイム コードを含む SMS メッセージをリッスンします。Google Chat の設定 メッセージを受信したら、サーバーにワンタイム コードを返送して 確認プロセスに進みます。

始める前に

アプリを準備するには、以下のセクションに示す手順を完了します。

アプリの前提条件

アプリのビルドファイルで次の値が使用されていることを確認します。

  • 19 以上の minSdkVersion
  • 28 以上の compileSdkVersion

アプリを設定する

プロジェクト レベルの build.gradle ファイルに、Google の Maven リポジトリを含めます。 および Maven セントラル リポジトリ buildscriptallprojects の両方のセクションで次のように設定します。

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

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

Google Play 開発者サービスの依存関係を追加する モジュールの Gradle ビルドファイルに SMS Retriever API を追加する 通常は 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. ユーザーの電話番号を取得する

ユーザーの電話番号は、 。多くの場合、ヒント選択ツールを使用してメッセージを表示すると、 デバイスに保存されている電話番号からユーザーが選択できるようになり、 手動で電話番号を入力する手間が省けますヒント選択ツールを使用するには:

// 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 を呼び出して、成功と SMS 取得タスクに障害リスナーを追加します。

// 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 取得タスクは、SMS メッセージを最大 5 分間リッスンします。 (アプリを識別する一意の文字列を含む)を作成します。

3. 電話番号をサーバーに送信する

ユーザーの電話番号を取得して SMS のリッスンを開始した後 任意の認証プロトコルを使用してユーザーの電話番号を認証サーバーに メソッド(通常は HTTPS POST リクエストを使用します)。

サーバーが確認メッセージを生成し、SMS でスマートフォンに送信する 表示されます。サーバーで SMS 検証を実行するをご覧ください。

4. 確認メッセージを受信する

ユーザーのデバイスで確認メッセージを受信すると、Play 開発者サービスは SmsRetriever.SMS_RETRIEVED_ACTION インテントをアプリに明示的にブロードキャストする場合 これにはメッセージのテキストが含まれますBroadcastReceiver を使用して受け取る この確認メッセージが表示されます

BroadcastReceiveronReceive ハンドラで、 インテントの送信元で確認メッセージ(および任意で送信者アドレス)が エクストラ:

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

この BroadcastReceiver をインテント フィルタに登録します。 com.google.android.gms.auth.api.phone.SMS_RETRIEVEDSmsRetriever.SMS_RETRIEVED_ACTION 定数など)と、 com.google.android.gms.auth.api.phone.permission.SENDSmsRetriever.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. 確認メールに記載されたワンタイム コードをサーバーに送信します。

確認メッセージのテキストを取得したら、正規表現を使用して メッセージからワンタイム コードを取得するためのロジックなどを指定できます。<ph type="x-smartling-void-element"><br></ph> サーバーへの実装方法によって異なります。

最後に、セキュリティで保護された接続を介してワンタイム コードをサーバーに送信します。日時 サーバーがワンタイム コードを受け取ると、電話番号に入力した電話番号が 確認されます。