未检索到 Firebase 用户的显示名称和照片网址

Posted

技术标签:

【中文标题】未检索到 Firebase 用户的显示名称和照片网址【英文标题】:Firebase User's display name and photo url is not retrieved 【发布时间】:2017-07-02 18:45:44 【问题描述】:

我正在使用 Firebase 开发 android 应用,在我的应用中我使用 Firebase 匿名登录和 Google 登录。

如果用户未登录,则应用程序启动时,我使用匿名身份验证来登录用户。

之后,当用户选择使用 Google 登录时,我将匿名帐户转换为永久帐户。

我的问题是,当用户的帐户从匿名帐户转换为永久帐户(在这种情况下使用 Google 登录)时,我没有得到用户的显示名称和照片网址。

为了从匿名帐户转换为永久帐户,我使用以下代码。

    AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);

            mAuth.getCurrentUser().linkWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() 
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) 
                        Log.d(TAG, "linkWithCredential:onComplete:" + task.isSuccessful());

                        if (!task.isSuccessful()) 
                            Toast.makeText(AnonymousAuthActivity.this, "Authentication failed.",Toast.LENGTH_SHORT).show();

//If Google Account already linked up with other UID
    Tasks.await(mAuth.signInWithCredential(credential)).getUser();
                        

                    
                );

登录过程完成后,会调用 AuthStateListener onAuthStateChanged,然后在 onAuthStateChanged 中提取用户的显示名称、用户的照片网址和用户的电子邮件。下面是 onAuthStateChanged 代码。

@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) 
    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    if (user != null && !(user.isAnonymous())) 
    Log.d("userDetails", "UID: " + user.getUid());
    Log.d("userDetails", "Name: " + user.getDisplayName());
    Log.d("userDetails", "PhotoUrl: " + user.getPhotoUrl().toString());
    Log.d("userDetails", "Email: " + user.getEmail());

在日志中,user.getDisplayName() 和 user.getPhotoUrl() 为空

我不明白我做错了什么。请帮忙。

感谢和问候,

【问题讨论】:

如果您退出并重新登录,那么onAuthStateChanged 中是否有用户的个人资料信息? 是的,我已尝试退出并重新登录,但用户的个人资料信息中的用户照片 url 和显示名称仍然为空。但如果我没有使用匿名登录,而是直接使用 Google 登录流程为用户签名,我可以获取用户的个人资料信息。 似乎在使用 signInWithCredentials 而不是在使用 linkWithCredential 时填充了照片和姓名 【参考方案1】:
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
user.getProviderData();

遍历提供者并获得所需的提供者

userData.getProviderId().equals(GoogleAuthProvider.PROVIDER_ID)
Uri photoUrl = userData.getPhotoUrl();

【讨论】:

对我来说仍然为空【参考方案2】:

在关联帐户时(甚至在每次登录时),调用此函数

Future<void> updateMissingUserPropertise(User user) async 
  if (user.photoURL == null) await user.updatePhotoURL(user.providerData[0].photoURL);
  if (user.displayName == null) await user.updateDisplayName(user.providerData[0].displayName);

为了支持多个提供商,每个提供商可能拥有不同的姓名、照片或电话号码,Firebase 身份验证在关联帐户时不会修改用户属性。

即使用户稍后退出并使用 Google 或任何其他联合帐户登录,也不会更改用户属性。

上面的函数通过从第一个提供者(在您的例子中是 Google)获取缺失的用户属性,并将它们设置在用户属性中,从而“修复”缺失的用户属性。

此函数的更复杂版本支持多个提供者的情况,循环通过提供者,直到找到 DisplayName 或 photoURL。

Future<void> updateMissingUserPropertise(User user) async 
  if (user.photoURL == null) 
    user.providerData.forEach((provider) async 
      if (provider.photoURL != null) 
        await user.updatePhotoURL(provider.photoURL);
        return;
      
    );
  
  if (user.displayName == null) 
    user.providerData.forEach((provider) async 
      if (provider.displayName != null) 
        await user.updateDisplayName(provider.displayName);
        return;
      
    );
  

【讨论】:

以上是关于未检索到 Firebase 用户的显示名称和照片网址的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 选项中未定义存储桶。将个人资料照片更新到 Firebase

swift:来自firebase的照片未显示在表格视图中

未从 firebase 数据库中检索个人资料图片

Firebase - iOS Swift:使用从两个单独的子节点检索到的数据加载表格视图单元格

在 Android 中未检索 Firebase 用户详细信息

无法在firebase + vue中检索用户详细信息和图像