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?
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
isso foi corrigido na v2.0.3 via https://github.com/arnesson/cordova-plugin-firebase/pull/861
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.