Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기

전화번호를 사용하여 Android에서 Firebase로 인증

Firebase 인증을 사용하여 사용자의 전화로 SMS 메시지를 전송하여 사용자를 로그인할 수 있습니다. 사용자는 SMS 메시지에 포함된 일회성 코드를 사용하여 로그인합니다.

앱에 전화번호 로그인을 추가하는 가장 쉬운 방법은 FirebaseUI 를 사용하는 것입니다. 여기에는 전화번호 로그인을 위한 로그인 흐름과 비밀번호 기반 통합 로그인을 구현하는 드롭인 로그인 위젯이 포함되어 있습니다. -안에. 이 문서에서는 Firebase SDK를 사용하여 전화번호 로그인 흐름을 구현하는 방법을 설명합니다.

시작하기 전에

  1. 아직 추가하지 않았다면 Android 프로젝트에 Firebase를 추가합니다 .
  2. 모듈(앱 수준) Gradle 파일 (일반적으로 <project>/<app-module>/build.gradle )에서 Firebase 인증 Android 라이브러리에 대한 종속성을 추가합니다. Firebase Android BoM 을 사용하여 라이브러리 버전 관리를 제어하는 ​​것이 좋습니다.

    Java

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:31.1.1')
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-auth'
    }
    

    Firebase Android BoM 을 사용하면 앱에서 항상 호환되는 버전의 Firebase Android 라이브러리를 사용합니다.

    (대안) BoM을 사용 하지 않고 Firebase 라이브러리 종속성 추가

    Firebase BoM을 사용하지 않기로 선택한 경우 종속성 줄에 각 Firebase 라이브러리 버전을 지정해야 합니다.

    앱에서 여러 Firebase 라이브러리를 사용하는 경우 BoM을 사용하여 모든 버전이 호환되도록 라이브러리 버전을 관리하는 것이 좋습니다.

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-auth:21.1.0'
    }
    

    Kotlin+KTX

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:31.1.1')
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-auth-ktx'
    }
    

    Firebase Android BoM 을 사용하면 앱에서 항상 호환되는 버전의 Firebase Android 라이브러리를 사용합니다.

    (대안) BoM을 사용 하지 않고 Firebase 라이브러리 종속성 추가

    Firebase BoM을 사용하지 않기로 선택한 경우 종속성 줄에 각 Firebase 라이브러리 버전을 지정해야 합니다.

    앱에서 여러 Firebase 라이브러리를 사용하는 경우 BoM을 사용하여 모든 버전이 호환되도록 라이브러리 버전을 관리하는 것이 좋습니다.

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-auth-ktx:21.1.0'
    }
    
  3. 앱을 Firebase 프로젝트에 아직 연결하지 않았다면 Firebase 콘솔 에서 연결하세요.
  4. Firebase 콘솔 에서 앱의 SHA-1 해시를 아직 설정하지 않았다면 설정하세요. 앱의 SHA-1 해시를 찾는 방법에 대한 자세한 내용은 클라이언트 인증 을 참조하세요.

보안 문제

전화번호만으로 인증하는 방식은 편리하지만 사용자 간에 전화번호의 소유권을 쉽게 이전할 수 있기 때문에 다른 방법에 비해 안전성이 떨어집니다. 또한 여러 사용자 프로필이 있는 기기에서 SMS 메시지를 받을 수 있는 모든 사용자는 기기의 전화번호를 사용하여 계정에 로그인할 수 있습니다.

앱에서 전화번호 기반 로그인을 사용하는 경우 더 안전한 로그인 방법과 함께 이를 제공하고 사용자에게 전화번호 로그인 사용의 보안 장단점을 알려야 합니다.

Firebase 프로젝트에 전화번호 로그인 사용

SMS로 사용자를 로그인하려면 먼저 Firebase 프로젝트에 전화번호 로그인 방법을 사용 설정해야 합니다.

  1. Firebase 콘솔 에서 인증 섹션을 엽니다.
  2. 로그인 방법 페이지에서 전화번호 로그인 방법을 활성화합니다.

Firebase의 전화번호 로그인 요청 할당량은 대부분의 앱이 영향을 받지 않을 만큼 충분히 높습니다. 그러나 전화 인증을 통해 매우 많은 수의 사용자를 로그인해야 하는 경우 요금제를 업그레이드해야 할 수 있습니다. 요금 페이지를 참조하세요.

앱 확인 사용

전화번호 인증을 사용하려면 Firebase에서 전화번호 로그인 요청이 앱에서 오는지 확인할 수 있어야 합니다. Firebase 인증에는 두 가지 방법이 있습니다.

  • SafetyNet : 사용자가 Google Play 서비스가 설치된 기기를 가지고 있고, Firebase 인증을 통해 Android SafetyNet 을 통해 기기가 적법한지 확인할 수 있으면 전화번호 로그인을 진행할 수 있습니다.
  • Firebase 인증에 SafetyNet을 사용하려면 다음 단계를 따르세요.

    1. Google Cloud Console에서 프로젝트에 Android DeviceCheck API 를 사용 설정합니다. 기본 Firebase API 키가 사용되며 DeviceCheck API에 대한 액세스를 허용해야 합니다.
    2. 앱의 SHA-256 지문을 아직 지정하지 않은 경우 Firebase 콘솔의 설정 페이지 에서 지정하십시오. 앱의 SHA-256 지문을 얻는 방법에 대한 자세한 내용은 클라이언트 인증 을 참조하세요.
  • reCAPTCHA 확인 : 사용자가 Google Play 서비스를 지원하지 않거나 에뮬레이터에서 앱을 테스트하는 경우와 같이 SafetyNet을 사용할 수 없는 경우 Firebase 인증은 reCAPTCHA 확인을 사용하여 전화 로그인 절차를 완료합니다. reCAPTCHA 챌린지는 종종 사용자가 아무것도 해결하지 않고도 완료할 수 있습니다. 이 흐름에서는 SHA-1이 애플리케이션과 연결되어 있어야 합니다. 또한 이 흐름에서는 API 키가 제한되지 않거나 "${PROJECT_NAME}.firebaseapp.com"에 대해 허용 목록에 있어야 합니다.

사용자의 전화로 인증 코드 전송

전화번호 로그인을 시작하려면 전화번호를 입력하라는 인터페이스를 사용자에게 제시하세요. 법적 요구 사항은 다양하지만 모범 사례로서 사용자에 대한 기대치를 설정하려면 전화 로그인을 사용하는 경우 확인을 위한 SMS 메시지를 받을 수 있으며 표준 요금이 적용될 수 있음을 사용자에게 알려야 합니다.

그런 다음 전화번호를 PhoneAuthProvider.verifyPhoneNumber 메서드에 전달하여 Firebase에서 사용자의 전화번호를 확인하도록 요청합니다. 예를 들어:

Java

PhoneAuthOptions options = 
  PhoneAuthOptions.newBuilder(mAuth) 
      .setPhoneNumber(phoneNumber)       // Phone number to verify
      .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
      .setActivity(this)                 // Activity (for callback binding)
      .setCallbacks(mCallbacks)          // OnVerificationStateChangedCallbacks
      .build();
  PhoneAuthProvider.verifyPhoneNumber(options);     

Kotlin+KTX

val options = PhoneAuthOptions.newBuilder(auth)
    .setPhoneNumber(phoneNumber)       // Phone number to verify
    .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
    .setActivity(this)                 // Activity (for callback binding)
    .setCallbacks(callbacks)          // OnVerificationStateChangedCallbacks
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

verifyPhoneNumber 메서드는 재진입 가능합니다. 활동의 onStart 메서드와 같이 여러 번 호출하는 경우 verifyPhoneNumber 메서드는 원래 요청이 시간 초과되지 않는 한 두 번째 SMS를 보내지 않습니다.

사용자가 로그인하기 전에(예: 사용자가 SMS 앱을 사용하는 동안) 앱이 닫히는 경우 이 동작을 사용하여 전화번호 로그인 프로세스를 재개할 수 있습니다. verifyPhoneNumber 를 호출한 후 확인이 진행 중임을 나타내는 플래그를 설정합니다. 그런 다음 활동의 onSaveInstanceState 메서드에 플래그를 저장하고 onRestoreInstanceState 에서 플래그를 복원합니다. 마지막으로 활동의 onStart 메서드에서 확인이 이미 진행 중인지 확인하고 진행 중인 경우 verifyPhoneNumber 를 다시 호출합니다. 확인이 완료되거나 실패하면 플래그를 지워야 합니다( 확인 콜백 참조).

화면 회전 및 기타 활동 재시작 인스턴스를 쉽게 처리하려면 활동을 verifyPhoneNumber 메소드에 전달하십시오. 콜백은 활동이 중지되면 자동으로 분리되므로 콜백 메서드에서 UI 전환 코드를 자유롭게 작성할 수 있습니다.

Firebase에서 보낸 SMS 메시지는 Auth 인스턴스의 setLanguageCode 메서드를 통해 인증 언어를 지정하여 현지화할 수도 있습니다.

Java

auth.setLanguageCode("fr");
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage();

Kotlin+KTX

auth.setLanguageCode("fr")
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage()

PhoneAuthProvider.verifyPhoneNumber 를 호출할 때 요청 결과를 처리하는 콜백 함수의 구현을 포함하는 OnVerificationStateChangedCallbacks 인스턴스도 제공해야 합니다. 예를 들어:

Java

mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    @Override
    public void onVerificationCompleted(PhoneAuthCredential credential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG, "onVerificationCompleted:" + credential);

        signInWithPhoneAuthCredential(credential);
    }

    @Override
    public void onVerificationFailed(FirebaseException e) {
        // This callback is invoked in an invalid request for verification is made,
        // for instance if the the phone number format is not valid.
        Log.w(TAG, "onVerificationFailed", e);

        if (e instanceof FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e instanceof FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        }

        // Show a message and update the UI
    }

    @Override
    public void onCodeSent(@NonNull String verificationId,
                           @NonNull PhoneAuthProvider.ForceResendingToken token) {
        // The SMS verification code has been sent to the provided phone number, we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG, "onCodeSent:" + verificationId);

        // Save verification ID and resending token so we can use them later
        mVerificationId = verificationId;
        mResendToken = token;
    }
};

Kotlin+KTX

callbacks = object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    override fun onVerificationCompleted(credential: PhoneAuthCredential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG, "onVerificationCompleted:$credential")
        signInWithPhoneAuthCredential(credential)
    }

    override fun onVerificationFailed(e: FirebaseException) {
        // This callback is invoked in an invalid request for verification is made,
        // for instance if the the phone number format is not valid.
        Log.w(TAG, "onVerificationFailed", e)

        if (e is FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e is FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        }

        // Show a message and update the UI
    }

    override fun onCodeSent(
        verificationId: String,
        token: PhoneAuthProvider.ForceResendingToken
    ) {
        // The SMS verification code has been sent to the provided phone number, we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG, "onCodeSent:$verificationId")

        // Save verification ID and resending token so we can use them later
        storedVerificationId = verificationId
        resendToken = token
    }
}

확인 콜백

대부분의 앱에서는 onVerificationCompleted , onVerificationFailedonCodeSent 콜백을 구현합니다. 앱의 요구 사항에 따라 onCodeAutoRetrievalTimeOut 을 구현할 수도 있습니다.

onVerificationCompleted(PhoneAuthCredential)

이 메서드는 두 가지 상황에서 호출됩니다.

  • 즉시 확인: 경우에 따라 확인 코드를 보내거나 입력할 필요 없이 전화번호를 즉시 확인할 수 있습니다.
  • 자동 검색: 일부 기기에서 Google Play 서비스는 들어오는 확인 SMS를 자동으로 감지하고 사용자 작업 없이 확인을 수행할 수 있습니다. (일부 이동통신사에서는 이 기능을 사용하지 못할 수 있습니다.) 이 기능은 SMS 메시지 끝에 11자 해시를 포함하는 SMS Retriever API 를 사용합니다.
두 경우 모두 사용자의 전화번호가 성공적으로 확인되었으며 콜백에 전달된 PhoneAuthCredential 개체를 사용 하여 사용자를 로그인할 수 있습니다 .

onVerificationFailed(FirebaseException)

이 메소드는 유효하지 않은 전화번호 또는 인증 코드를 지정하는 요청과 같은 유효하지 않은 인증 요청에 대한 응답으로 호출됩니다.

onCodeSent(문자열 validationId, PhoneAuthProvider.ForceResendingToken)

선택 과목. 이 메서드는 제공된 전화번호로 인증 코드가 SMS로 전송된 후에 호출됩니다.

이 메소드가 호출되면 대부분의 앱은 사용자에게 SMS 메시지의 인증 코드를 입력하라는 UI를 표시합니다. (동시에 백그라운드에서 자동 인증이 진행 중일 수 있습니다.) 그러면 사용자가 인증 코드를 입력한 후 메소드에 전달된 인증 코드와 인증 ID를 사용하여 PhoneAuthCredential 객체를 생성할 수 있습니다. 차례로 사용자를 로그인하는 데 사용할 수 있습니다. 그러나 일부 앱은 확인 코드 UI를 표시하기 전에 onCodeAutoRetrievalTimeOut 이 호출될 때까지 기다릴 수 있습니다(권장하지 않음).

onCodeAutoRetrievalTimeOut(문자열 확인 ID)

선택 과목. onVerificationCompleted가 onVerificationCompleted verifyPhoneNumber 지정된 제한 시간이 경과한 후에 이 메서드가 호출됩니다. SIM 카드가 없는 장치에서는 SMS 자동 검색이 불가능하기 때문에 이 메서드가 즉시 호출됩니다.

일부 앱은 자동 확인 기간이 만료될 때까지 사용자 입력을 차단한 다음 SMS 메시지의 확인 코드를 입력하라는 UI만 표시합니다(권장하지 않음).

PhoneAuthCredential 개체 만들기

사용자가 Firebase에서 사용자의 전화로 전송한 확인 코드를 입력한 후 onCodeSent 또는 onCodeAutoRetrievalTimeOut 콜백에 전달된 확인 코드와 확인 ID를 사용하여 PhoneAuthCredential 객체를 만듭니다. ( onVerificationCompleted 가 호출되면 PhoneAuthCredential 객체를 직접 가져오므로 이 단계를 건너뛸 수 있습니다.)

PhoneAuthCredential 개체를 만들려면 PhoneAuthProvider.getCredential 을 호출합니다.

Java

PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);

Kotlin+KTX

val credential = PhoneAuthProvider.getCredential(verificationId!!, code)

사용자 로그인

onVerificationCompleted 콜백에서든 PhoneAuthProvider.getCredential 을 호출하여 PhoneAuthCredential 객체를 가져온 후에는 PhoneAuthCredential 객체를 FirebaseAuth.signInWithCredential 에 전달하여 로그인 PhoneAuthProvider.getCredential 를 완료하세요.

Java

private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInWithCredential:success");

                        FirebaseUser user = task.getResult().getUser();
                        // Update UI
                    } else {
                        // Sign in failed, display a message and update the UI
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                        if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                            // The verification code entered was invalid
                        }
                    }
                }
            });
}

Kotlin+KTX

private fun signInWithPhoneAuthCredential(credential: PhoneAuthCredential) {
    auth.signInWithCredential(credential)
            .addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    // Sign in success, update UI with the signed-in user's information
                    Log.d(TAG, "signInWithCredential:success")

                    val user = task.result?.user
                } else {
                    // Sign in failed, display a message and update the UI
                    Log.w(TAG, "signInWithCredential:failure", task.exception)
                    if (task.exception is FirebaseAuthInvalidCredentialsException) {
                        // The verification code entered was invalid
                    }
                    // Update UI
                }
            }
}

가상 전화번호로 테스트

Firebase 콘솔을 통해 개발용 가상 전화번호를 설정할 수 있습니다. 가상 전화번호로 테스트하면 다음과 같은 이점이 있습니다.

  • 사용 할당량을 소모하지 않고 전화번호 인증을 테스트합니다.
  • 실제 SMS 메시지를 보내지 않고 전화번호 인증을 테스트합니다.
  • 조절되지 않고 동일한 전화번호로 연속 테스트를 실행합니다. 이렇게 하면 리뷰어가 테스트를 위해 동일한 전화번호를 사용하는 경우 앱 스토어 리뷰 프로세스 중에 거부될 위험이 최소화됩니다.
  • Google Play 서비스 없이 iOS 시뮬레이터 또는 Android 에뮬레이터에서 개발할 수 있는 기능과 같이 추가 노력 없이 개발 환경에서 쉽게 테스트할 수 있습니다.
  • 프로덕션 환경에서 실제 전화번호에 일반적으로 적용되는 보안 검사에 의해 차단되지 않고 통합 테스트를 작성합니다.

가상 전화번호는 다음 요구 사항을 충족해야 합니다.

  1. 실제로 허구이고 이미 존재하지 않는 전화번호를 사용해야 합니다. Firebase 인증에서는 실제 사용자가 사용하는 기존 전화번호를 테스트 번호로 설정할 수 없습니다. 한 가지 옵션은 555개의 접두어를 미국 테스트 전화번호로 사용하는 것입니다(예: +1 650-555-3434) .
  2. 전화번호는 길이 및 기타 제약 조건에 따라 올바른 형식을 지정해야 합니다. 여전히 실제 사용자의 전화번호와 동일한 유효성 검사를 거칩니다.
  3. 개발을 위해 최대 10개의 전화번호를 추가할 수 있습니다.
  4. 추측하기 어려운 테스트 전화번호/코드를 사용하고 자주 변경하십시오.

가상의 전화번호 및 인증 코드 생성

  1. Firebase 콘솔 에서 인증 섹션을 엽니다.
  2. 로그인 방법 탭에서 전화 공급자를 아직 활성화하지 않은 경우 활성화합니다.
  3. 테스트용 전화번호 아코디언 메뉴를 엽니다.
  4. 테스트하려는 전화번호를 제공합니다(예: +1 650-555-3434 ) .
  5. 해당 특정 번호에 대한 6자리 확인 코드를 제공합니다(예: 654321 ) .
  6. 번호를 추가 하세요. 필요한 경우 해당 행 위로 마우스를 이동하고 휴지통 아이콘을 클릭하여 전화번호와 코드를 삭제할 수 있습니다.

수동 테스트

애플리케이션에서 가상의 전화번호를 사용하여 직접 시작할 수 있습니다. 이를 통해 할당량 문제나 제한 없이 개발 단계에서 수동 테스트를 수행할 수 있습니다. Google Play 서비스를 설치하지 않고 iOS 시뮬레이터 또는 Android 에뮬레이터에서 직접 테스트할 수도 있습니다.

가상의 전화번호를 제공하고 인증 코드를 보내면 실제 SMS가 전송되지 않습니다. 대신 로그인을 완료하려면 이전에 구성한 확인 코드를 제공해야 합니다.

로그인이 완료되면 해당 전화번호로 Firebase 사용자가 생성됩니다. 사용자는 실제 전화번호 사용자와 동일한 동작 및 속성을 가지며 동일한 방식으로 실시간 데이터베이스/Cloud Firestore 및 기타 서비스에 액세스할 수 있습니다. 이 과정에서 발행되는 ID 토큰은 실제 전화번호 사용자와 동일한 서명을 가집니다.

또 다른 옵션은 액세스를 추가로 제한하려는 경우 이러한 사용자에 대한 사용자 지정 클레임을 통해 테스트 역할을 설정하여 가짜 사용자로 구분하는 것입니다.

테스트를 위해 reCAPTCHA 흐름을 수동으로 트리거하려면 forceRecaptchaFlowForTesting() 메서드를 사용합니다.

// Force reCAPTCHA flow
FirebaseAuth.getInstance().getFirebaseAuthSettings().forceRecaptchaFlowForTesting();

통합 테스트

수동 테스트 외에도 Firebase 인증은 전화 인증 테스트를 위한 통합 테스트를 작성하는 데 도움이 되는 API를 제공합니다. 이러한 API는 웹에서 reCAPTCHA 요구 사항을 비활성화하고 iOS에서 자동 푸시 알림을 비활성화하여 앱 확인을 비활성화합니다. 이를 통해 이러한 흐름에서 자동화 테스트가 가능하고 구현이 더 쉬워집니다. 또한 Android에서 즉시 확인 흐름을 테스트하는 기능을 제공하는 데 도움이 됩니다.

Android에서는 signInWithPhoneNumber 호출 전에 setAppVerificationDisabledForTesting() 을 호출합니다. 이렇게 하면 앱 확인이 자동으로 비활성화되므로 수동으로 해결하지 않고도 전화번호를 전달할 수 있습니다. reCAPTCHA 및/또는 SafetyNet이 비활성화되더라도 실제 전화번호를 사용하면 로그인이 완료되지 않습니다. 이 API에는 가상 전화번호만 사용할 수 있습니다.

// Turn off phone auth app verification.
FirebaseAuth.getInstance().getFirebaseAuthSettings()
   .setAppVerificationDisabledForTesting();

가상 번호로 verifyPhoneNumber 를 호출하면 해당 확인 코드를 제공해야 하는 onCodeSent 콜백이 트리거됩니다. 이를 통해 Android 에뮬레이터에서 테스트할 수 있습니다.

Java

String phoneNum = "+16505554567";
String testVerificationCode = "123456";

// Whenever verification is triggered with the whitelisted number,
// provided it is not set for auto-retrieval, onCodeSent will be triggered.
FirebaseAuth auth = FirebaseAuth.getInstance();
PhoneAuthOptions options = PhoneAuthOptions.newBuilder(auth)
        .setPhoneNumber(phoneNum)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onCodeSent(String verificationId,
                                   PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                // Save the verification id somewhere
                // ...

                // The corresponding whitelisted code above should be used to complete sign-in.
                MainActivity.this.enableUserManuallyInputCode();
            }

            @Override
            public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
                // Sign in with the credential
                // ...
            }

            @Override
            public void onVerificationFailed(FirebaseException e) {
                // ...
            }
        })
        .build();
PhoneAuthProvider.verifyPhoneNumber(options);

Kotlin+KTX

val phoneNum = "+16505554567"
val testVerificationCode = "123456"

// Whenever verification is triggered with the whitelisted number,
// provided it is not set for auto-retrieval, onCodeSent will be triggered.
val options = PhoneAuthOptions.newBuilder(Firebase.auth)
        .setPhoneNumber(phoneNum)
        .setTimeout(30L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

            override fun onCodeSent(
                    verificationId: String,
                    forceResendingToken: PhoneAuthProvider.ForceResendingToken
            ) {
                // Save the verification id somewhere
                // ...

                // The corresponding whitelisted code above should be used to complete sign-in.
                this@MainActivity.enableUserManuallyInputCode()
            }

            override fun onVerificationCompleted(phoneAuthCredential: PhoneAuthCredential) {
                // Sign in with the credential
                // ...
            }

            override fun onVerificationFailed(e: FirebaseException) {
                // ...
            }
        })
        .build()
PhoneAuthProvider.verifyPhoneNumber(options)

또한 setAutoRetrievedSmsCodeForPhoneNumber 를 호출하여 자동 검색을 위한 가상 번호 및 해당 확인 코드를 설정하여 Android에서 자동 검색 흐름을 테스트할 수 있습니다.

verifyPhoneNumber 가 호출되면 PhoneAuthCredential 로 직접 onVerificationCompleted 를 트리거합니다. 가상의 전화번호에서만 작동합니다.

Google Play 스토어에 애플리케이션을 게시할 때 이 기능이 비활성화되어 있고 가상 전화번호가 앱에 하드코딩되어 있지 않은지 확인하세요.

Java

// The test phone number and code should be whitelisted in the console.
String phoneNumber = "+16505554567";
String smsCode = "123456";

FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
FirebaseAuthSettings firebaseAuthSettings = firebaseAuth.getFirebaseAuthSettings();

// Configure faking the auto-retrieval with the whitelisted numbers.
firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode);

PhoneAuthOptions options = PhoneAuthOptions.newBuilder(firebaseAuth)
        .setPhoneNumber(phoneNumber)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onVerificationCompleted(PhoneAuthCredential credential) {
                // Instant verification is applied and a credential is directly returned.
                // ...
            }

            // ...
        })
        .build();
PhoneAuthProvider.verifyPhoneNumber(options);

Kotlin+KTX

// The test phone number and code should be whitelisted in the console.
val phoneNumber = "+16505554567"
val smsCode = "123456"

val firebaseAuth = Firebase.auth
val firebaseAuthSettings = firebaseAuth.firebaseAuthSettings

// Configure faking the auto-retrieval with the whitelisted numbers.
firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode)

val options = PhoneAuthOptions.newBuilder(firebaseAuth)
        .setPhoneNumber(phoneNumber)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            override fun onVerificationCompleted(credential: PhoneAuthCredential) {
                // Instant verification is applied and a credential is directly returned.
                // ...
            }

            // ...
        })
        .build()
PhoneAuthProvider.verifyPhoneNumber(options)

다음 단계

사용자가 처음으로 로그인하면 새 사용자 계정이 생성되고 사용자가 로그인할 때 사용한 자격 증명(즉, 사용자 이름과 암호, 전화 번호 또는 인증 공급자 정보)에 연결됩니다. 이 새 계정은 Firebase 프로젝트의 일부로 저장되며 사용자 로그인 방법에 관계없이 프로젝트의 모든 앱에서 사용자를 식별하는 데 사용할 수 있습니다.

  • 앱에서 FirebaseUser 개체에서 사용자의 기본 프로필 정보를 가져올 수 있습니다. 사용자 관리 를 참조하십시오.

  • Firebase 실시간 데이터베이스 및 Cloud Storage 보안 규칙 에서 auth 변수에서 로그인한 사용자의 고유한 사용자 ID를 가져와 사용자가 액세스할 수 있는 데이터를 제어하는 ​​데 사용할 수 있습니다.

인증 공급자 자격 증명을 기존 사용자 계정에 연결하여 사용자가 여러 인증 공급자를 사용하여 앱에 로그인하도록 허용할 수 있습니다.

사용자를 로그아웃하려면 signOut 을 호출합니다.

Java

FirebaseAuth.getInstance().signOut();

Kotlin+KTX

Firebase.auth.signOut()