You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity集成Firebase Google登录报GoogleSignInException错误及解决方法

Unity Firebase Google登录问题(已解决)

已解决说明

编辑:已解决问题
问题出在密钥上。将应用上传至Google控制台,并使用了应用完整性下的SHA1密钥后问题解决。

问题背景

我是Unity及Firebase/GoogleSignIn的新手,正尝试在Unity中基于Firebase搭建Google登录按钮。
使用环境:

  • Unity 2021.3.6f1
  • 目标平台:Android 6+
  • 脚本后端:IL2CPP
  • 平台API兼容等级:.Net Standard 2.1
  • 目标架构:ARMv7 & ARM64
  • 非开发构建,Firebase项目设置中Prod-Tag未标记为生产环境

操作步骤

  • 使用PlayerSettings中的包名创建Unity Firebase项目;
  • 下载google-services.json并添加至资源文件夹;
  • 下载Firebase Unity SDK 9.3.0的FirebaseAuth.unitypackage及google-signin-plugin-1.0.4.unitypackage,导入Unity(跳过Google登录插件的Parse,删除FirebaseAuth中Net 3.5的unity.tasks.dll和unity.compat.dll);
  • 启用认证功能 -> 登录方式 -> Google(Web-Client-ID与google-services.json中的一致);
  • 在Unity发布设置的密钥库管理器中生成密钥库,通过Java keytool读取SHA-256指纹并添加至Firebase项目设置;
  • 使用google-services.json中类型为3的WebClient ID OAuth客户端ID;
  • 构建应用并安装到手机后,抛出以下错误:
DeveloperError Exception of type 'Google.GoogleSignIn+SignInException' was thrown.

代码实现

using UnityEngine;
using UnityEngine.UI;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using Firebase;
using Firebase.Auth;
using Firebase.Extensions;
using Google;
using System.Net.Http;


public class FirebaseGoogleLogin : MonoBehaviour
{
    public Text warning;
    public Animator anWarning;
    private bool fireBaseReady;


    private GoogleSignInConfiguration configuration;
    Firebase.DependencyStatus dependencyStatus = Firebase.DependencyStatus.UnavailableOther;
    Firebase.Auth.FirebaseAuth auth;
    Firebase.Auth.FirebaseUser user;

    void Awake()
    {
        configuration = new GoogleSignInConfiguration
        {
            WebClientId = "XXX from google-services.json",
            RequestIdToken = true
        };
    }

    private void Start()
    {
        auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
    }

    public void OnSignIn()
    {
        GoogleSignIn.Configuration = configuration;
        GoogleSignIn.Configuration.UseGameSignIn = false;
        GoogleSignIn.Configuration.RequestIdToken = true;
        GoogleSignIn.Configuration.RequestEmail = true;

        user = auth.CurrentUser;
        if (user != null)
        {
            warning.text = "User signed in successfully:" + user.Email + " " + user.UserId;
            anWarning.Play("Base Layer.FontButtonFadeLong", 0, 0);
        }
        else
        {
            GoogleSignIn.DefaultInstance.SignIn().ContinueWith(OnAuthenticationFinished);
        }
    }

    internal void OnAuthenticationFinished(Task<GoogleSignInUser> task) 
    {
        //TaskCompletionSource<FirebaseUser> signInCompleted = new TaskCompletionSource<FirebaseUser>();
        //signIn.ContinueWith(task => { 
            if (task.IsCanceled)
            {
                warning.text = "1:" + task.Exception;
                anWarning.Play("Base Layer.FontButtonFadeLong", 0, 0);
            }
            else if (task.IsFaulted)   //ERROR OCCURS HERE
            {
                using (IEnumerator<System.Exception> enumerator =
               task.Exception.InnerExceptions.GetEnumerator())
                {
                    if (enumerator.MoveNext())
                    {
                        GoogleSignIn.SignInException error =
                                (GoogleSignIn.SignInException)enumerator.Current;
                        warning.text = "Got Error: " + error.Status + " " + error.Message;
                        anWarning.Play("Base Layer.FontButtonFadeLong", 0, 0);
                    }
                    else
                    {
                    warning.text = "Got Unexpected Exception?!?" + task.Exception;
                    anWarning.Play("Base Layer.FontButtonFadeLong", 0, 0);
                    }
                }
            }
            else
            {
                warning.text = "3";
                anWarning.Play("Base Layer.FontButtonFadeLong", 0, 0);
                Credential credential = Firebase.Auth.GoogleAuthProvider.GetCredential(((Task<GoogleSignInUser>)task).Result.IdToken, null);
                auth.SignInWithCredentialAsync(credential).ContinueWith(authTask => {
                    if (authTask.IsCanceled)
                    {
                        warning.text = "auth task canceled:" + authTask.Exception;
                        anWarning.Play("Base Layer.FontButtonFadeLong", 0, 0);
                    }
                    else if (authTask.IsFaulted)
                    {
                        warning.text = "auth task is faulted:" + authTask.Exception;
                        anWarning.Play("Base Layer.FontButtonFadeLong", 0, 0);
                    }
                    else
                    {
                        warning.text = "User signed in successfully:";
                        anWarning.Play("Base Layer.FontButtonFadeLong", 0, 0);
                    }
                });
            }
       // });
    }
}

OnSignIn由按钮点击触发。错误出现在internal void OnAuthenticationFinished(Task<GoogleSignInUser> task)的(task.IsFaulted)分支。

其他编译警告

除了FirebaseGoogleLogin.cs脚本中的以下错误外,Unity中无其他控制台/构建错误:

Error CS0433: The type 'Task' exists in both 'Unity.Tasks, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' and 'netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=XXX' Assembly-CSharp, Assembly-CSharp.Player

但有人说这是常见问题,不会造成影响。

经过大量时间排查,请问我哪里出错了?(注:后续已通过配置Google控制台SHA1密钥解决)


内容的提问来源于stack exchange,提问作者user5441400

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:40:09