Android Firebase电话身份验证INVALID_APP_CREDENTIAL:应用验证失败

时间:2017-06-08 09:44:23

标签: android firebase firebase-authentication

我是android firebase的新手,我已经为Firebase Auth实现了必要的库。我尝试输入一个有效的数字,但日志上写着:

W/JEJE: onVerificationFailed
com.google.firebase.FirebaseException: An internal error has occurred. [ INVALID_APP_CREDENTIAL:App validation failed ]
at com.google.android.gms.internal.nf.zzK(Unknown Source)
at com.google.android.gms.internal.og.zza(Unknown Source)
at com.google.android.gms.internal.oh.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6176)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:778)

这是我的代码:

public class MainActivity extends AppCompatActivity {

    private static String mVerificationId;
    private static PhoneAuthProvider.ForceResendingToken mResendToken;
    private static FirebaseAuth mAuth;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final EditText editText = (EditText) findViewById(R.id.phone);
        Button submit = (Button) findViewById(R.id.submit);

        final PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallBacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
                Log.d("JEJE", "onVerificationCompleted:" + phoneAuthCredential);

                signInWithPhoneAuthCredential(phoneAuthCredential);
            }

            @Override
            public void onVerificationFailed(FirebaseException e) {
                Log.w("JEJE", "onVerificationFailed", e);

                if (e instanceof FirebaseAuthInvalidCredentialsException) {
                    Log.d("JEJE", "INVALID REQUEST");
                } else if (e instanceof FirebaseTooManyRequestsException) {
                    Log.d("JEJE", "Too many Request");
                }
            }

            @Override
            public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                super.onCodeSent(s, forceResendingToken);
                Log.d("JEJE", "onCodeSent:" + s);

                mVerificationId = s;
                mResendToken = forceResendingToken;

            }
        };

        submit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String phoneNum = editText.getText().toString();
                Toast.makeText(MainActivity.this, phoneNum, Toast.LENGTH_SHORT).show();
                verifyPhone(phoneNum,mCallBacks);
            }

        });
    }

    private void signInWithPhoneAuthCredential(PhoneAuthCredential phoneAuthCredential) {
        mAuth.signInWithCredential(phoneAuthCredential).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()){
                    FirebaseUser user = task.getResult().getUser();
                }else {
                    if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                        // The verification code entered was invalid
                    }
                }
            }
        });
    }

    public void verifyPhone(String phoneNumber, PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallbacks){
        PhoneAuthProvider.getInstance().verifyPhoneNumber(
                "+639952874699",        // Phone number to verify
                60,                 // Timeout duration
                TimeUnit.SECONDS,   // Unit of timeout
                this,               // Activity (for callback binding)
                mCallbacks);        // OnVerificationStateChangedCallback
    }

}
请告诉我什么是错误的谢谢..

6 个答案:

答案 0 :(得分:16)

添加SHA Certificate Fingerprint解决了我的问题。嗯,我相当新,但我设法显示输出,我能够收到短信验证。

以下是我的代码: https://github.com/coozgan/TestingPhoneAuth

答案 1 :(得分:4)

我和你的问题完全相同。即使我上传了两个SHA1,它仍然会给出一个&#34;手机登录错误&#34;提示。

您需要将Firebase项目与Google Play相关联。

前往https://console.firebase.google.com/u/0/project/you-project-name/settings/accountlinking并点击右下角&#34;链接到Google Play&#34;

答案 2 :(得分:3)

过了一会儿,我只想总结一下我发现的关于手机验证的所有信息。您需要做一些事情,并且应该记住它可以工作。

以下是您需要执行的操作列表:

  1. 使用您从firebase获得的google-services.json创建一个应用并将其连接到您的应用。将其放入正确的文件夹中,并确保已添加到Gradle compile 'com.google.firebase:firebase-auth:11.0.4'
  2. 在firebase上的应用中,转到菜单上的Authentication。然后转到Sign-in Method并确保启用电话提供商。
  3. 将Sha-1添加到您的应用中。在项目中进行项目设置时,转到应用程序部分的底部,您将看到放置Sha-1的位置。 为了获得Sha-1,您需要运行此命令
  4.   

    keytool -exportcert -list -v -alias androiddebugkey -keystore   %USERPROFILE%\。机器人\ debug.keystore

    如firebase指南中所述。注意这个命令在线,所以一起运行它,它会做什么,它会在你的用户的名为.android的隐藏文件夹中查找你的debug.keystore文件。密钥库的默认别名是androiddebugkey所以不要更改它,它的默认密码是android,所以当它要求你输入密码时,只需使用“android”。 然后你会看到一个返回列表,其中一个是Sha-1。把它放在你的项目中。

    1. 如果仍然无效,则并非总是需要,但请确保您的应用已关联到Google帐户。在您的项目设置 - &gt;帐户关联 - > Google Play。
    2. 另请注意,这是写于2017年8月16日,您无法在模拟器上进行手机验证,因此请使用真实设备。

      希望它有所帮助。

      感谢saurabh Yadav缺少斜线;)显然我必须在这里放两条斜线才能显示。

答案 3 :(得分:1)

我也有同样的问题。

在阅读了一些内容后,我发现了一些其他问题并在运行我的应用程序后。

问题1:this链接说明了,

另请注意,电话号码登录需要物理设备,并且无法在模拟器上运行。

所以你可以在真实设备上测试和运行,而不是任何模拟器。

如果你可以在模拟器上运行,那么同样的错误就会给出。

您可以参考我的github this链接获取Firebase电话登录示例

答案 4 :(得分:0)

尝试将firebase-tools lib升级到最新版本,然后调用firebase注销,然后登录firebase登录。

答案 5 :(得分:0)

如果您要进行签名构建并将其放入Play商店,则游戏商店的sha1应与Firebase指纹的sha1相同。完成后,您需要通过firebase登录将您的应用程序与Play商店链接。在sha1密钥更改后,从您在firebase帐户中生成的新应用程序中放置新的google-services.json文件。< / p>