Firebase AppCheck令牌始终为空

rn0zuynd  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(116)

我有这个问题,因为一个星期的Xamarin Android应用程序.我用这个方法得到token:

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.jackda$getToken$1(DefaultFirebaseAppCheck.java:205)at com.google.firebase.appcheck.internal.DefaultFirebaseAppCheck$$ExternalSyntheticLambda1.then(Unknown Source:0)在www.example.com(com.谷歌。机器人gms:play-services-tasks@@18.0.2:1)在Android上。骨密度在android上调用(Handler.java:942)。骨密度android上的dispatchMessage(Handler.java:99)。os. Looper. loopOnce(Looper.java:201)at android. os. Looper.在android中循环(Looper.java:288)。app. ActivityThread. main(ActivityThread.java:7892)at java. lang。反思。方法。在com上调用(本地方法)。机器人内部的os. RuntimeInit $www.example.com(RuntimeInit.java:548)at com.机器人内部的os. ZygoteInit. main(ZygoteInit.java:936)原因:com.google.android.gms.tasks.zze.run null at java. lang. Long. parseLong(Long.java:699)at java. lang. Long. parseLong(Long.java:861)at com. google. firebase. appcheck. playintegrity. internal. PlayIntegrityAppCheckProvider. lambda $getPlayIntegrityAttestation $4 $com-google-firebase-appcheck-playintegrity-internal-PlayIntegrityAppCheckProvider(PlayIntegrityAppCheckProvider.java:105)at com.google.firebase.appcheck.playintegrity.internal. PlayIntegrityAppCheckProvider$$ExternalSyntheticLambda1.then(Unknown Source:4)at www.example.com(com. google. android. gms:play-services-tasks@@18.0.2:1).MethodAndArgsCaller.run
    我还尝试从Firebase Console生成一个调试令牌,以便在调试模式下在应用程序中使用,但当我调用Firebase Storage(已经强制执行)时,它一直说“AppCheck令牌无效”。
    • 更新**:我也尝试过这种方法:FirebaseAppCheck AppCheck = FirebaseAppCheck.Instance; AppCheck.InstallAppCheckProviderFactory(PlayIntegrityProviderFactory.Instance);和只有一次FirebaseException说类似"PlayStore不是最新的在您的设备"。所以我更新了PlayStore,现在它抛出了上面描述的相同错误。我试过用AddOnSuccessListener(this)来获取令牌,但结果是一样的。另外,我必须告诉在if语句之前声明的var AppCheckToken始终成为DefaultFirebaseAppCheckTokenResult类的对象。我不知道还能做什么...

恕我直言,声明对象(空值)有一个问题,但是因为没有关于如何在C#上使用AppCheck的文档,所以我被搞砸了。

kmynzznz

kmynzznz1#

我遇到了类似的问题,发现以下方法对我有效。问题是,在调试中,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

相关问题