Firebase AppCheck 令牌始终为空

问题描述 投票:0回答:1

自从一周以来我在 Xamarin Android 应用程序上遇到了这个问题。 我用这个方法得到了令牌:

public async void GetToken()
{
 var AppCheckToken =  await AppCheck.GetToken(false);

            if (AppCheckToken is AppCheckTokenResult Tok)
            {
                string r;
                r = Tok.Token;
                Preferences.Set("AppCheckToken", r);
            }
}

在调试和物理(生产)模式下始终返回此字符串

eyJlcnJvciI6IlVOS05PV05fRVJST1IifQ==
。我还尝试在 Play Console 中进行内部测试,然后从那里下载应用程序,但结果始终相同。

这是我初始化 AppCheck 的方法:

        auth = FirebaseAuth.GetInstance(app);
        PlayIntegrityAppCheckProviderFactory f = new PlayIntegrityAppCheckProviderFactory();
        f.Create(app);
        AppCheck = FirebaseAppCheck.GetInstance(app);
        AppCheck.InstallAppCheckProviderFactory(f);
        AppCheck.SetTokenAutoRefreshEnabled(true);

我还注意到 GetToken() 方法中声明的 AppCheckToken 变量始终为 null 并返回此 FirebaseException:

--- 托管 Firebase.FirebaseException 堆栈跟踪结束 --- com.google.firebase.FirebaseException: null at com.google.firebase.appcheck.internal.DefaultFirebaseAppCheck.lambda$getToken$1(DefaultFirebaseAppCheck.java:205) 在 com.google.firebase.appcheck.internal.DefaultFirebaseAppCheck$$ExternalSyntheticLambda1.then(未知 来源:0) 于 com.google.android.gms.tasks.zze.run(com.google.android.gms:play-services-tasks@@18.0.2:1) 在 android.os.Handler.handleCallback(Handler.java:942) 处 android.os.Handler.dispatchMessage(Handler.java:99) 位于 android.os.Looper.loopOnce(Looper.java:201) 在 android.os.Looper.loop(Looper.java:288) 在 android.app.ActivityThread.main(ActivityThread.java:7892) 在 java.lang.reflect.Method.invoke(本机方法) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) 引起 通过:java.lang.NumberFormatException:null at java.lang.Long.parseLong(Long.java:699) 在 java.lang.Long.parseLong(Long.java:861) 在 com.google.firebase.appcheck.playintegrity.internal.PlayIntegrityAppCheckProvider.lambda$getPlayIntegrityAttestation$4$com-google-firebase-appcheck-playintegrity-internal-PlayIntegrityAppCheckProvider(PlayIntegrityAppCheckProvider.java:105) 位于 com.google.firebase.appcheck.playintegrity.internal.PlayIntegrityAppCheckProvider$$ExternalSyntheticLambda1.then(未知 资料来源:4) 于 com.google.android.gms.tasks.zzo.run(com.google.android.gms:play-services-tasks@@18.0.2:1) ...还有8个

我还尝试从 Firebase 控制台生成调试令牌,以便在调试模式下在应用程序中使用,但是当我调用 Firebase Storage(已强制执行)时,它一直显示“AppCheck 令牌无效”。

更新: 我也尝试过这种方法:

FirebaseAppCheck AppCheck = FirebaseAppCheck.Instance; AppCheck.InstallAppCheckProviderFactory(PlayIntegrityProviderFactory.Instance);
仅一次,FirebaseException 会说“您的设备中的 PlayStore 未更新”之类的内容。所以我更新了 PlayStore,现在它抛出了与上述相同的错误。我尝试使用
AddOnSuccessListener(this)
获取令牌,但结果是相同的。 另外我必须告诉,在 if 语句之前声明的
var AppCheckToken
始终成为类 DefaultFirebaseAppCheckTokenResult 的对象。 我不知道还能做什么...

恕我直言,对象声明(为空)存在问题,但由于没有关于如何在 C# 上使用 AppCheck 的文档,我完蛋了。

c# firebase xamarin.android token firebase-app-check
1个回答
0
投票

嘿,我面临着类似的问题,发现以下内容对我有用。问题是在调试中 AppCheckTokenResult 的结果与您在发布版本中收到的结果类型不同。我检索令牌的方法只是添加了一种进一步的类型检查来解释这一点。

    public async Task<string> GetAppCheckToken()
{
    var appCheck = FirebaseAppCheck.GetInstance(_firebaseApp);
    var token = string.Empty;
    var appCheckToken = await appCheck.GetAppCheckToken(false);
    
    if (appCheckToken is AppCheckTokenResult Tok)
    {
        token = Tok.Token;
    }
    else if (appCheckToken is DefaultAppCheckToken defaultToken)
    {
        token = defaultToken.Token;
    }

    return token;
}

DefaultAppCheckToken
位于 Firebase.AppCheck.Internal 命名空间中,因此您需要在文件顶部包含以下内容
using Firebase.AppCheck.Internal;

为了清楚起见,我按以下方式为应用程序检查设置了 Firebase 配置

    var firebaseApp = FirebaseApp.InitializeApp(activity);

                // Get an instance of FirebaseAppCheck
                FirebaseAppCheck firebaseAppCheck = 
    FirebaseAppCheck.GetInstance(firebaseApp);

                //// Continue with Firebase AppCheck initialization
    #if DEBUG
                firebaseAppCheck.InstallAppCheckProviderFactory(
                    DebugAppCheckProviderFactory.Instance);
    #else
                firebaseAppCheck.InstallAppCheckProviderFactory(
                    PlayIntegrityAppCheckProviderFactory.Instance);
#endif

我希望这有帮助。我也因缺乏有关 Firebase 的 dotnet 接口的文档而苦苦挣扎。但这样做是非常有意义的。

© www.soinside.com 2019 - 2024. All rights reserved.