Java 通过microsoft进行Firebase身份验证-不显示登录选项卡

Java 通过microsoft进行Firebase身份验证-不显示登录选项卡,java,android,firebase,Java,Android,Firebase,从firebaseauth教程中获取了一些复制粘贴代码,用于将我的应用程序上的客户端与Microsoft身份验证连接。问题是,登录屏幕没有显示 你可以找到完整的教程 注意,我复制了所有内容只是为了测试连接(不包括可选代码,以简化事情) firebaseAuth.startActivityForSignInWithProvider方法中的问题统计信息。它总是以失败告终。跟踪显示此消息: “FirebaseAuthException…尝试获取包证书哈希时出错。” 我做了教程中的所有事情,包括在Mic

从firebaseauth教程中获取了一些复制粘贴代码,用于将我的应用程序上的客户端与Microsoft身份验证连接。问题是,登录屏幕没有显示

你可以找到完整的教程

注意,我复制了所有内容只是为了测试连接(不包括可选代码,以简化事情)

firebaseAuth.startActivityForSignInWithProvider方法中的问题统计信息。它总是以失败告终。跟踪显示此消息: “FirebaseAuthException…尝试获取包证书哈希时出错。”

我做了教程中的所有事情,包括在Microsoft注册我的应用程序和Firebase身份验证屏幕。我在android studio emulator和实际设备上运行了这段代码,结果相同

我的登录功能:

public void signinToMicrosoft(Activity activity) {

    OAuthProvider.Builder provider = OAuthProvider.newBuilder("microsoft.com");
    Log.e(TAG,"Signing with microsoft");


    Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult();
    if (pendingResultTask != null) {
        // There's something already here! Finish the sign-in for your user.
        pendingResultTask
                .addOnSuccessListener(
                        new OnSuccessListener<AuthResult>() {
                            @Override
                            public void onSuccess(AuthResult authResult) {
                                Log.e(TAG,"Pending Success");
                                // User is signed in.
                                // IdP data available in
                                // authResult.getAdditionalUserInfo().getProfile().
                                // The OAuth access token can also be retrieved:
                                // authResult.getCredential().getAccessToken().
                            }
                        })
                .addOnFailureListener(
                        new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Log.e(TAG,"Pending Failed: "+e.getMessage());
                                // Handle failure.
                            }
                        });
    } else {
        Log.e(TAG,"No Pending");
        // There's no pending result so you need to start the sign-in flow.
        // See below.
    }

    firebaseAuth
            .startActivityForSignInWithProvider(activity, provider.build())
            .addOnSuccessListener(
                    new OnSuccessListener<AuthResult>() {
                        @Override
                        public void onSuccess(AuthResult authResult) {
                            Log.e(TAG,"Auth Success");
                            // User is signed in.
                            // IdP data available in
                            // authResult.getAdditionalUserInfo().getProfile().
                            // The OAuth access token can also be retrieved:
                            // authResult.getCredential().getAccessToken().
                        }
                    })
            .addOnFailureListener(
                    new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Log.e(TAG,"Auth Failed: "+e.getMessage() + "\nTrace: "+ e.getClass().getCanonicalName());
                            // Handle failure.
                        }
                    });


}
public void signinToMicrosoft(活动){
OAuthProvider.Builder provider=OAuthProvider.newBuilder(“microsoft.com”);
Log.e(标记“与microsoft签署”);
Task PendingSultTask=firebaseAuth.getPendingAuthResult();
if(pendingreulttask!=null){
//此处已存在内容!请完成用户的登录。
悬而未决的任务
.addOnSuccessListener(
新OnSuccessListener(){
@凌驾
成功时公共无效(AuthResult AuthResult){
Log.e(标签“待定成功”);
//用户已登录。
//IdP数据可在
//authResult.getAdditionalUserInfo().getProfile()。
//还可以检索OAuth访问令牌:
//authResult.getCredential().getAccessToken()。
}
})
.addOnFailureListener(
新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Log.e(标记“挂起失败:”+e.getMessage());
//处理失败。
}
});
}否则{
Log.e(标记“无待定”);
//没有挂起的结果,因此需要启动登录流。
//见下文。
}
firebaseAuth
.startActivityForSignInWithProvider(活动,provider.build())
.addOnSuccessListener(
新OnSuccessListener(){
@凌驾
成功时公共无效(AuthResult AuthResult){
Log.e(标记“Auth Success”);
//用户已登录。
//IdP数据可在
//authResult.getAdditionalUserInfo().getProfile()。
//还可以检索OAuth访问令牌:
//authResult.getCredential().getAccessToken()。
}
})
.addOnFailureListener(
新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Log.e(标记“身份验证失败:”+e.getMessage()+“\n链接:”+e.getClass().getCanonicalName());
//处理失败。
}
});
}

一个定制的chrome标签本应打开并允许登录Microsoft,但它会在一瞬间弹出并关闭。如果有人有这个问题,或者能帮我解决,我将不胜感激。谢谢

要解决此问题,您需要在android上安装microsoft(hotmail、outlook…)帐户。

如果有人仍然存在此问题,我只想与大家分享我的解决方案和类似的问题

TL;DR

您的SHA-1指纹可能被其他Firebase项目使用,因此请删除该指纹或使用其他密钥库进行签名

长版本

我曾参与过一个使用不同Firebase项目的开发和生产环境的项目。我们使用Firebase Auth链接我们Android应用程序的Microsoft登录。在尝试设置项目的开发环境时,我遇到了与上面相同的错误。我们过去只有一个Firebase环境,所以这从来都不是问题


事实证明,当您在创建项目时没有提供SHA-1指纹时,Firebase会在您运行身份验证调用时自动添加它们。这意味着,当我们为测试创建调试APK时,SHA-1指纹被记录到用于实时环境的Firebase项目中,因此当您尝试在另一个项目中添加相同的指纹时,它不会允许您。解决方案是在开发环境中包括SHA-1指纹,但要做到这一点,您需要将其从实时环境(在我的情况下)中删除,并等待该更改反映出来。或者您可以使用另一个未使用的密钥库进行签名。

嘿,Asaf,您可以验证在Firebase控制台中注册的SHA-1与您的应用程序签名的SHA-1是否匹配吗?通常,当你看到这个错误时,这就是正在发生的事情。如果这还不能解决问题,请使用模拟器上的Google Play services版本发表评论,并查看更新是否有助于解决问题。嗨,Malcolm,谢谢你的回复。如果你的意思是应用程序的秘密比是的,它匹配,我尝试创建一个新的,并再次做的过程,但仍然没有工作。我用我的手机进行了测试,play services的版本是16.0.89,最新版本SHA-1不同于应用程序机密-它是在您构建应用程序时签名的密钥。请验证您是否已按照s中的说明进行了注册