android - firebase 升级到 9.2.0 后,google signin uid 和 firebase uid 不匹配

标签 android firebase firebase-authentication google-signin

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

升级前-

Google 登录 uid = 101672719428298324455

Firebase uid = google:101672719428298324455

升级后-

Google 登录 uid = 101672719428298324455

Firebase uid = fcojpImyQWTHp02YzWYsRezShKP2

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

但是,那么,我们如何使用带有升级的 firebase 的 google 登录 uid 为 auth 编写安全规则?规则的具体用例是教师可以阅读学生的成绩单。 google classroom 为类(class)花名册提供的教师和学生 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();

类(class)的学生使用 google-classroom 加载

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

然后,老师使用谷歌登录 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);

最佳答案

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

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

To get the profile information retrieved from the sign-in providers linked to a user, use the getProviderData method. For example:

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 对象列表,因为单个用户帐户可以有多个链接的提供商。

关于android - firebase 升级到 9.2.0 后,google signin uid 和 firebase uid 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38402278/

相关文章:

android - 谷歌身份验证迁移到 androidx : SignInHubActivity does not implement Lifecycle

java - 在 Leiningen 项目的 Google Maven 存储库中找不到 Firebase jar

javascript - 将自定义数据添加到 firebase 数据库

android - request.auth.uid 中会有什么?

android - 我们什么时候应该将 FirebaseUser.getToken(Boolean forcerefresh) 设置为 true?

java - inputStream无法获取csv文件android

android - 无法使用 react-native 在 Android 上呈现具有绝对位置的 View

java - SQLite数据库读取错误 'no such file or directory '

firebase 仅导入所需的包

javascript - typescript : How to resolve 'rxjs/Rx has no exported member ' SubscriptionLike'