Cordova-plugin-firebase: Problème de vérification instantanée de Firebase Phone Auth (Android)

Créé le 3 juin 2018  ·  4Commentaires  ·  Source: arnesson/cordova-plugin-firebase

Lisez-moi a déclaré que je devais appeler mon point de terminaison pour obtenir un jeton personnalisé et me connecter. J'ai mis en œuvre selon le guide fourni et je peux me connecter maintenant.

D'après ce que j'ai compris, n'est-ce pas lorsque Firebase auth me renvoie la vérification instantanée est vrai, je devrais me connecter directement au lieu de demander un jeton personnalisé à mon point de terminaison pour me connecter avec un jeton personnalisé ?

La méthode indiquée dans le fichier readme est-elle une solution de contournement temporaire ou un correctif permanent ?

authentication help wanted question

Commentaire le plus utile

@YaMo97 : Votre solution est correcte 👍. Je vais essayer de le mettre en œuvre.
Je pense que c'est une mauvaise idée d'appeler le serveur principal avec un numéro de téléphone pour obtenir le jeton. C'est une grosse faille de sécurité . Tout le monde peut accéder à cette URL, transmettre n'importe quel numéro de téléphone en paramètre et obtenir un jeton pour accéder à l'application.

Tous les 4 commentaires

Je suis confronté au même dilemme et, en parcourant les documents Firebase, j'ai découvert que certains points peuvent être utilisés pour parvenir à un correctif permanent.

Lien vers Firebase Docs : - Authentifiez-vous avec Firebase sur Android à l'aide d'un numéro de téléphone

Citant les docs : -

onVerificationCompleted(PhoneAuthCredential)

Cette méthode est appelée dans deux situations :

  • Vérification instantanée : dans certains cas, le numéro de téléphone peut être vérifié instantanément sans avoir besoin d'envoyer ou de saisir un code de vérification.
  • Récupération automatique : sur certains appareils, les services Google Play peuvent détecter automatiquement la vérification entrante

SMS et effectuer une vérification sans action de l'utilisateur. (Cette fonctionnalité peut ne pas être disponible avec certains opérateurs.)
Dans les deux cas, _le numéro de téléphone de l'utilisateur a été vérifié avec succès et vous pouvez utiliser l'objet PhoneAuthCredential qui est passé au rappel pour vous connecter à l'utilisateur._

onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken)

Optionnel. Cette méthode est appelée après que le code de vérification a été envoyé par SMS au numéro de téléphone fourni.

Lorsque cette méthode est appelée, la plupart des applications affichent une interface utilisateur qui invite l'utilisateur à saisir le code de vérification à partir du message SMS. (En même temps, la vérification automatique peut se dérouler en arrière-plan.) _ Ensuite, une fois que l'utilisateur a tapé le code de vérification, vous pouvez utiliser le code de vérification et l'ID de vérification qui ont été transmis à la méthode pour créer un objet PhoneAuthCredential, que vous pouvez ensuite utiliser pour vous connecter à l'utilisateur _. Cependant, certaines applications peuvent attendre que onCodeAutoRetrievalTimeOut soit appelé avant d'afficher l'interface utilisateur du code de vérification (non recommandé).

Si vous vous concentrez sur le texte en italique, le PhoneAuthCredential peut être utilisé pour connecter l'utilisateur.

Dans le cas onCodeSent() , nous créons nous-mêmes le PhoneAuthCredential , puis nous nous connectons à l'aide du code suivant :

signInWithOTP(verificationId: string, otpCode: string): Promise<firebase.User> {
        return firebase.auth().signInWithCredential(
            firebase.auth.PhoneAuthProvider.credential(verificationId, otpCode)
        );
}

Mais dans le cas de onVerificationCompleted() , le PhoneAuthCredential est passé au callback...

L'implémentation de ceci dans le plugin est la suivante où PhoneAuthCredential est passé au callback : -
https://github.com/arnesson/cordova-plugin-firebase/blob/c53bd4aa04e83e37009ecfb1fd4342ac2cc78618/src/android/FirebasePlugin.java#L937 -L962

Donc, si nous pouvions exposer ce PhoneAuthCredentia l en dehors du plugin, renvoyé le long du pluginResult ou peut-être implémenter une fonction signIn() dans le plugin comme indiqué dans la documentation de firebase : -

Connectez-vous l'utilisateur

Après avoir obtenu un objet PhoneAuthCredential, que ce soit dans le rappel onVerificationCompleted ou en appelant PhoneAuthProvider.getCredential, terminez le flux de connexion en passant l'objet PhoneAuthCredential à FirebaseAuth.signInWithCredential :

private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                <strong i="24">@Override</strong>
                public void onComplete(<strong i="25">@NonNull</strong> 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();
                        // ...
                    } 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
                        }
                    }
                }
            });
}

En ajoutant returnResults.put("credential", credential); à ces lignes, nous pouvons retourner le PhoneAuthCredential à utiliser plus loin, comme cela se fait dans onCodeSent() : -
https://github.com/arnesson/cordova-plugin-firebase/blob/c53bd4aa04e83e37009ecfb1fd4342ac2cc78618/src/android/FirebasePlugin.java#L948 -L951

Peut-être que la vérification instantanée pourrait également être gérée en utilisant le plugin de cette façon.

Je ne suis pas un expert en la matière et je fais juste quelques déductions à partir des informations disponibles. Un peu de remue-méninges, mais si quelqu'un pouvait le faire avancer à partir d'ici, ce serait génial.

@YaMo97 : Votre solution est correcte 👍. Je vais essayer de le mettre en œuvre.
Je pense que c'est une mauvaise idée d'appeler le serveur principal avec un numéro de téléphone pour obtenir le jeton. C'est une grosse faille de sécurité . Tout le monde peut accéder à cette URL, transmettre n'importe quel numéro de téléphone en paramètre et obtenir un jeton pour accéder à l'application.

vous avez raison @ placha433 - Je n'ai jamais pensé à ce hack pendant que j'essayais de résoudre ce problème. C'est donc sur moi et le fichier readme devrait être modifié. Nous avons cessé d'utiliser Firebase pour ce projet, car il ne faisait pas le travail comme nous le souhaitions.

J'adore vous voir pousser une solution pour ça

Cette page vous a été utile?
0 / 5 - 0 notes