Android 앱에서 SMS 인증 요청

전화번호를 자동으로 인증하려면 클라이언트 및 서버 부분까지 전달됩니다. 이 문서에서는 Android 앱에서 클라이언트 부분을 구현해야 합니다.

Android 앱에서 전화번호 인증 과정을 시작하려면 전화번호를 인증 서버에 연결하고 SMS Retriever API를 호출하여 시작합니다. 앱의 일회용 코드가 포함된 SMS 메시지를 수신 대기해야 합니다. 사용자가 수신하면 일회용 코드를 서버로 다시 전송하여 확인 절차입니다.

시작하기 전에

앱을 준비하려면 다음 섹션의 단계를 완료합니다.

앱 기본 요건

앱의 빌드 파일이 다음 값을 사용하는지 확인합니다.

  • minSdkVersion 19 이상
  • compileSdkVersion 28 또는 이후 버전

앱 구성

프로젝트 수준의 build.gradle 파일에 Google의 Maven 저장소를 포함합니다. 및 Maven 중앙 저장소 buildscriptallprojects 섹션 모두에서 다음을 수행합니다.

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

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

Google Play 서비스 종속 항목 추가 SMS Retriever API를 모듈의 Gradle 빌드 파일에 추가합니다. 일반적으로 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를 호출하고 성공을 첨부하고 실패 리스너를 추가합니다.

// 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 가져오기 작업은 최대 5분 동안 SMS 메시지를 수신합니다. 로 대체해야 합니다.

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_RETRIEVED( SmsRetriever.SMS_RETRIEVED_ACTION 상수) 및 권한 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. 인증 메시지에서 서버로 일회성 코드 전송

이제 확인 메시지 텍스트가 있으므로 정규 표현식을 사용합니다. 또는 다른 로직을 사용하여 메시지에서 일회성 코드를 가져올 수 있습니다. 일회성 코드는 서버에서 구현한 방법에 따라 달라집니다.

마지막으로, 보안 연결을 통해 서버에 일회성 코드를 전송합니다. 날짜 서버에서 일회성 코드를 받으면 해당 전화번호가 확인되었습니다.