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