Gérer les erreurs de vérification du numéro de téléphone Firebase sur Android

En cas d'échec d'un appel à la bibliothèque Firebase PNV, celle-ci renvoie un FirebasePhoneNumberVerificationException. Cette page liste tous les codes d'erreur que l'exception peut contenir, quand chacun d'eux se produit et ce que votre application doit faire.

Cette page suppose que vous avez intégré Firebase PNV comme décrit dans Premiers pas avec Firebase Phone Number Verification sur Android.

Comment les erreurs sont-elles signalées ?

  • Les méthodes asynchrones (getVerificationSupportInfo(), getVerifiedPhoneNumber() et les méthodes de flux personnalisé) renvoient un Task. En cas d'échec, l'Task échoue avec un FirebasePhoneNumberVerificationException, que vous recevez dans addOnFailureListener.

  • enableTestSession() est synchrone. Elle génère directement une exception FirebasePhoneNumberVerificationException.

Lisez le errorCode de l'exception pour découvrir ce qui s'est mal passé. Les codes Firebase PNV sont des constantes de la classe FirebasePnvStatusCodes. Si l'échec provient des services Google Play, errorCode peut également être une valeur CommonStatusCodes, telle que NETWORK_ERROR.

Un appareil ou une carte SIM non compatibles ne constituent pas une erreur. getVerificationSupportInfo() réussit et indique isSupported() comme false pour cette carte SIM, et getReason() vous indique pourquoi. Consultez Appareils et cartes SIM non compatibles.

Codes d'erreur

Configuration de la session de test

Ces erreurs sont générées de manière synchrone par enableTestSession().

Code d'erreur Cause Action recommandée
TEST_SESSION_ALREADY_ENABLED
(55508)
enableTestSession() a été appelé plusieurs fois dans le même processus d'application. FirebasePhoneNumberVerification.getInstance() renvoie la même instance à chaque fois. Cela se produit donc également lorsqu'un Activity qui l'appelle est recréé. Appelez enableTestSession() une fois par processus, par exemple dans Application.onCreate(). Consultez Initialiser la bibliothèque en mode test.
INVALID_TEST_NUMBER_ID
(55507)
Le jeton de test transmis à enableTestSession() est vide. Assurez-vous que votre build transmet le jeton que vous avez généré dans la console Firebase et n'appelez enableTestSession() que lorsque le jeton n'est pas vide.

Validation

Ces erreurs entraînent l'échec de l'Task renvoyé par getVerifiedPhoneNumber().

Code d'erreur Cause Action recommandée
CREDENTIAL_MANAGER_ERROR
(55506)
Le Gestionnaire d'identifiants Android n'a pas renvoyé le numéro de téléphone. Si l'cause de l'exception est un GetCredentialCancellationException, l'utilisateur a probablement fermé l'écran de consentement. Proposez une autre méthode pour valider le numéro de téléphone, par exemple par SMS. Ne réessayez pas automatiquement, car l'utilisateur verrait à nouveau l'écran de consentement.
CARRIER_NOT_SUPPORTED
(55501)
L'opérateur de la carte SIM sélectionnée n'est pas compatible, ou l'appareil ne dispose pas des informations d'abonnement nécessaires pour la valider. Utilisez une autre méthode de validation, comme les SMS.
UNSUPPORTED_OPERATION
(55505)
Firebase PNV n'est pas disponible pour cette requête sur l'appareil. Utilisez une autre méthode de validation, comme les SMS.
PREFLIGHT_CHECK_FAILED
(55504)
Le backend Firebase PNV n'a pas pu créer la demande de validation avant l'affichage de l'écran de consentement. Utilisez une autre méthode de validation, comme les SMS. Si cela se produit pour chaque requête, vérifiez que votre application est correctement configurée (voir Passer en mode production).
INTEGRITY_CHECK_FAILED
(55503)
L'appareil ou l'application n'a pas réussi une vérification de l'intégrité. Utilisez une autre méthode de validation, comme les SMS.
INVALID_DIGITAL_CREDENTIAL_RESPONSE
(55502)
La réponse de Credential Manager n'a pas pu être lue ou n'a pas pu être échangée contre un numéro de téléphone validé. Utilisez une autre méthode de validation, comme les SMS.
INVALID_TEST_NUMBER_ID
(55507)
En mode test, le backend Firebase PNV a rejeté le jeton de test, par exemple parce qu'il a expiré. Les jetons de test ont une valeur TTL de sept jours. Un jeton de test refusé renvoie généralement ce code. Si vous voyez d'autres erreurs en mode test, vérifiez également que votre jeton est à jour. Générez un nouveau jeton de test dans la console Firebase et recompilez votre application.
ACTIVITY_CONTEXT_REQUIRED
(55509)
La valeur Context transmise à getVerifiedPhoneNumber() n'est pas un Activity. La méthode nécessite un Activity pour afficher l'écran de consentement. Transmettez le Activity actuel. Il s'agit d'un bug dans votre application, et non d'une condition à gérer au moment de l'exécution.

Vérification de la compatibilité

La valeur Task renvoyée par getVerificationSupportInfo() n'échoue que si la vérification elle-même ne peut pas s'exécuter. Dans ce cas, errorCode est une valeur CommonStatusCodes des services Google Play ou CARRIER_NOT_SUPPORTED. Traitez l'appareil comme non compatible et utilisez une autre méthode de validation, comme les SMS.

Lorsqu'une session de test est activée, getVerificationSupportInfo() ne contacte pas le backend Firebase PNV et indique toujours que la carte SIM de test est compatible, même si le jeton de test a expiré.

Flux personnalisé

Si vous utilisez le flux personnalisé au lieu de getVerifiedPhoneNumber() :

  • getDigitalCredentialPayload() échoue avec PREFLIGHT_CHECK_FAILED ou avec INVALID_TEST_NUMBER_ID si le backend rejette votre jeton de test.
  • exchangeCredentialResponseForPhoneNumber() échoue avec INVALID_DIGITAL_CREDENTIAL_RESPONSE ou avec INVALID_TEST_NUMBER_ID si le backend rejette votre jeton de test.
  • Votre propre appel à Credential Manager génère une exception GetCredentialException, que vous gérez directement.

Appareils et cartes SIM non compatibles

Lorsque isSupported() est défini sur false pour une carte SIM, getReason() renvoie l'une des valeurs VerificationSupportStatus suivantes :

Valeur Signification
INCAPABLE_DUE_TO_CARRIER_UNSUPPORTED L'opérateur de la carte SIM n'est pas pris en charge. Consultez Opérateurs compatibles.
INCAPABLE_DUE_TO_ANDROID_VERSION L'appareil exécute une version d'Android antérieure à Android 9 (niveau d'API 28).
INCAPABLE_DUE_TO_SIM_STATE La carte SIM n'est pas prête. Une carte SIM verrouillée ou en cours de chargement peut également renvoyer INCAPABLE_DUE_TO_CARRIER_UNSUPPORTED, car l'opérateur est vérifié en premier.

Dans chaque cas, utilisez une autre méthode de validation, comme les SMS, pour cette carte SIM.

Exemple

L'exemple suivant gère les erreurs qu'une application type doit distinguer lors de l'appel de getVerifiedPhoneNumber() :

Kotlin

import android.util.Log
// Credential Manager is included with the Firebase PNV library.
import androidx.credentials.exceptions.GetCredentialCancellationException
import com.google.firebase.pnv.FirebasePhoneNumberVerification
import com.google.firebase.pnv.FirebasePhoneNumberVerificationException
import com.google.firebase.pnv.FirebasePnvStatusCodes

private const val TAG = "PhoneVerification"

// In your Activity:
private fun verifyPhoneNumber() {
    FirebasePhoneNumberVerification.getInstance()
        .getVerifiedPhoneNumber(this)
        .addOnSuccessListener { result ->
            // Send result.getToken() to your backend.
        }
        .addOnFailureListener { e -> handleFpnvError(e) }
}

private fun handleFpnvError(e: Exception) {
    if (e !is FirebasePhoneNumberVerificationException) {
        Log.w(TAG, "Firebase PNV failed", e)
        showSmsVerification()
        return
    }
    when (e.errorCode) {
        FirebasePnvStatusCodes.CREDENTIAL_MANAGER_ERROR -> {
            if (e.cause is GetCredentialCancellationException) {
                // The user dismissed the consent screen.
            }
            showSmsVerification()
        }
        FirebasePnvStatusCodes.INVALID_TEST_NUMBER_ID -> {
            // Test mode only: generate a new test token.
            Log.e(TAG, "Firebase PNV test token rejected", e)
        }
        FirebasePnvStatusCodes.ACTIVITY_CONTEXT_REQUIRED -> {
            // App bug: pass an Activity to getVerifiedPhoneNumber().
            Log.e(TAG, "Firebase PNV needs an Activity context", e)
        }
        else -> {
            // Carrier not supported, network errors, and other failures.
            Log.w(TAG, "Firebase PNV failed with error code ${e.errorCode}", e)
            showSmsVerification()
        }
    }
}

Dans cet exemple, showSmsVerification() correspond au flux de validation du numéro de téléphone existant de votre application.

Étapes suivantes