Cordova-plugin-firebase: Problema de verificação instantânea do Firebase Phone Auth (Android)

Criado em 3 jun. 2018  ·  4Comentários  ·  Fonte: arnesson/cordova-plugin-firebase

Leiame declarou que tenho que chamar meu endpoint para obter um token personalizado e entrar. Implementei de acordo com o guia fornecido e posso entrar agora.

Pelo que entendi, quando o Firebase auth retorna a verificação instantânea é verdadeiro, não devo fazer login diretamente em vez de solicitar um token personalizado do meu endpoint para fazer login com token personalizado?

O método indicado no leia-me é uma solução alternativa temporária ou correção permanente?

authentication help wanted question

Comentários muito úteis

@ YaMo97 : Sua solução está correta 👍. Vou tentar implementá-lo.
Acho uma má ideia ligar para o servidor de back-end com o número de telefone para obter o token. É uma grande violação de segurança . Qualquer pessoa pode acessar essa URL, passar qualquer número de telefone como parâmetro e obter um token para obter acesso no aplicativo.

Todos 4 comentários

Estou enfrentando o mesmo dilema e, ao examinar os documentos do Firebase, descobri que alguns pontos podem ser usados ​​para chegar a uma solução permanente.

Link para o Firebase Docs: - Autentique-se com o Firebase no Android usando um número de telefone

Citando os documentos: -

onVerificationCompleted (PhoneAuthCredential)

Este método é chamado em duas situações:

  • Verificação instantânea: em alguns casos, o número de telefone pode ser verificado instantaneamente sem a necessidade de enviar ou inserir um código de verificação.
  • Recuperação automática: em alguns dispositivos, o Google Play Services pode detectar automaticamente a verificação de entrada

SMS e verificação sem ação do usuário. (Este recurso pode não estar disponível em algumas operadoras.)
Em ambos os casos, _o número de telefone do usuário foi verificado com sucesso e você pode usar o objeto PhoneAuthCredential que é passado para o retorno de chamada para fazer o login do usuário._

onCodeSent (String verificationId, PhoneAuthProvider.ForceResendingToken)

Opcional. Este método é chamado depois que o código de verificação é enviado por SMS para o número de telefone fornecido.

Quando esse método é chamado, a maioria dos aplicativos exibe uma IU que solicita que o usuário digite o código de verificação da mensagem SMS. (Ao mesmo tempo, a verificação automática pode estar ocorrendo em segundo plano.) _ Então, depois que o usuário digitar o código de verificação, você pode usar o código de verificação e a ID de verificação que foi passada ao método para criar um objeto PhoneAuthCredential, que você pode usar para fazer login no usuário _. No entanto, alguns aplicativos podem esperar até que onCodeAutoRetrievalTimeOut seja chamado antes de exibir a IU do código de verificação (não recomendado).

Se você focar no texto em itálico, PhoneAuthCredential pode ser usado para fazer o login do usuário.

No caso de onCodeSent() , criamos PhoneAuthCredential nós mesmos e, em seguida, fazemos login usando o seguinte código:

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

Mas no caso de onVerificationCompleted() , o PhoneAuthCredential é passado para o retorno de chamada ...

A implementação disso no plug-in é a seguinte, onde PhoneAuthCredential é passado para o retorno de chamada: -
https://github.com/arnesson/cordova-plugin-firebase/blob/c53bd4aa04e83e37009ecfb1fd4342ac2cc78618/src/android/FirebasePlugin.java#L937 -L962

Então, se pudéssemos expor este PhoneAuthCredentia l fora do plug-in, retornado junto com pluginResult ou talvez implementar uma função signIn() dentro do plug-in conforme citado nos documentos do firebase: -

Faça login do usuário

Depois de obter um objeto PhoneAuthCredential, seja no retorno de chamada onVerificationCompleted ou chamando PhoneAuthProvider.getCredential, conclua o fluxo de login passando o objeto PhoneAuthCredential para 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
                        }
                    }
                }
            });
}

Adicionando returnResults.put("credential", credential); a essas linhas, podemos retornar o PhoneAuthCredential para ser usado posteriormente, como sendo feito em onCodeSent() : -
https://github.com/arnesson/cordova-plugin-firebase/blob/c53bd4aa04e83e37009ecfb1fd4342ac2cc78618/src/android/FirebasePlugin.java#L948 -L951

Talvez a Verificação instantânea também possa ser tratada usando o plug-in dessa forma.

Não sou especialista nisso e estou apenas fazendo algumas deduções a partir das informações disponíveis. Tipo de brainstorming, mas se alguém pudesse levar adiante a partir daqui, seria ótimo.

@ YaMo97 : Sua solução está correta 👍. Vou tentar implementá-lo.
Acho uma má ideia ligar para o servidor de back-end com o número de telefone para obter o token. É uma grande violação de segurança . Qualquer pessoa pode acessar essa URL, passar qualquer número de telefone como parâmetro e obter um token para obter acesso no aplicativo.

você está certo @ placha433 - Nunca pensei sobre esse hack enquanto tentava consertar o problema. Portanto, é por minha conta e o readme deve ser alterado. Paramos de usar o Firebase neste projeto, pois ele não funcionava direito como queríamos.

Adoro ver vocês tentando consertar isso

Esta página foi útil?
0 / 5 - 0 avaliações