Firebase 升级到 9.2.0 后,Google 登录 uid 和 firebase uid 不匹配

Posted

技术标签:

【中文标题】Firebase 升级到 9.2.0 后,Google 登录 uid 和 firebase uid 不匹配【英文标题】:google signin uid & firebase uid don't match after firebase upgrade to 9.2.0 【发布时间】:2016-11-19 00:40:26 【问题描述】:

我将 firebase 数据库升级到 9.2.0 版。 firebase uid 曾经是 google:(google signin id),但现在不匹配了。

升级前 -

谷歌登录 uid = 101672719428298324455

Firebase uid = google:101672719428298324455

升级后 -

谷歌登录 uid = 101672719428298324455

Firebase uid = fcojpImyQWTHp02YzWYsRezShKP2

google uid 是由其他服务(例如教室)返回的,因此,我们需要使用它作为 uid 来判断它是哪个用户。我们将更新用户字段以使用 google 登录 uid 而不是 firebase 。

但是,那么,我们如何使用 google 登录 uid 和升级后的 firebase 为身份验证编写安全规则?规则的具体用例是教师可以阅读学生的成绩单。 google 课堂为班级名册提供的教师和学生 uid 与 google 登录 uid 匹配,而不是 firebase uid。

在升级后用于登录的代码下方 -

FirebaseAuth auth = FirebaseAuth.getInstance();
        AuthCredential credential = GoogleAuthProvider.getCredential(token, secret);
        auth.signInWithCredential(credential).addOnCompleteListener(new OnCompleteListener<AuthResult>() 
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) 

                // Authenticated successfully with payload authData
                AuthResult result = task.getResult();
                FirebaseUser user = result.getUser();

使用 google-clas-s-room 加载班级的学生

"google:101379167706178411999": 
  "profile" : 
    "course" : 
      "students" : 
        "google:102942138935686001927" : 
          "profile" : 
            "name" : "student1 U."
          
        ,
        "google:111992383609839990527" : 
          "profile" : 
            "name" : "student2 U."
          
        
      
    ,
    "email" : "...",
    "name" : "teacher User",
  

然后,老师使用 google 登录 id 来查询学生 -

 queryRef = mFirebase.child("users").child(uid).child("profile").child("course").child("students").orderByKey();
        listListener = queryRef.addChildEventListener(new ChildEventListener() 
            @Override
            public void onChildAdded(DataSnapshot snapshot, String previousChild) 
                Log.d("DashboardDataHandler", "Attaching listener to: " + snapshot.getKey());
                final String key = snapshot.getKey();
                addOrUpdateUserProfile(snapshot, key);

【问题讨论】:

此用户在升级前是否存在?因为在这种情况下,用户在登录升级后的后端时应该获得相同的 UID。 没有。我们在投入生产之前进行了升级。我们正准备投入生产。使用新的 firebase 控制台创建了新的数据库。这对新用户来说也是一个问题,因为 google-clas-s-room 认为他们拥有的 id(google 登录 id)不是 firebase 所拥有的 auth.uid 【参考方案1】:

对于现有用户,当您将现有项目导入新的 Firebase 控制台 (https://console.firebase.google.com) 时,他们的 uid 不会改变。但是导入项目后创建的用户会得到新的uid格式。这是有意的:您不应依赖 Firebase 提供的 UID 中的任何固有结构。

如果您想知道使用 Google 帐户登录 Firebase 身份验证的用户的 Google ID,可以从 currentUser 字段中查找。来自accessing a user's provider-specific profile information 上的文档:

要获取从链接到用户的登录提供程序检索的个人资料信息,请使用 getProviderData 方法。例如:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) 
    for (UserInfo profile : user.getProviderData()) 
        // Id of the provider (ex: google.com)
        String providerId = profile.getProviderId();

        // UID specific to the provider
        String uid = profile.getUid();

        // Name, email address, and profile photo Url
        String name = profile.getDisplayName();
        String email = profile.getEmail();
        Uri photoUrl = profile.getPhotoUrl();
    ;

您会注意到getProviderData 现在返回一个UserInfo 对象列表,因为单个用户帐户可以有多个链接的提供者。

【讨论】:

以上是关于Firebase 升级到 9.2.0 后,Google 登录 uid 和 firebase uid 不匹配的主要内容,如果未能解决你的问题,请参考以下文章

为啥将 iOS 升级到 10.3 后 firebase 通知不再起作用?

将 Oracle 数据库从 9.2.0.7 升级到 9.2.0.8

升级firebase核心后颤动Ios构建失败

Google Play Services GCM 9.2.0 要求“更新”回 9.0.0

当firebase ui升级到3.2.2时输出未显示

依赖项升级后 Android Firebase 依赖项出现颤振问题