【问题标题】:How to get the email of any user in Firebase based on user id?如何根据用户 ID 在 Firebase 中获取任何用户的电子邮件?
【发布时间】:2015-07-05 13:13:46
【问题描述】:

我需要获取一个用户对象,特别是用户电子邮件,我将获得这种格式的用户 ID:

simplelogin:6

所以我需要写一个类似这样的函数:

getUserEmail('simplelogin:6')

这可能吗?

【问题讨论】:

  • 这是旧的但没有好的答案。你有没有自己解决过?电话号码是否相似(自提出此问题以来的新功能)

标签: firebase


【解决方案1】:

可以使用 Admin SDK

Admin SDK 不能在客户端上使用,只能在您可以从客户端调用的 Firebase Cloud Functions 中使用。您将获得这些承诺:set a cloud function up 真的很容易。)

admin.auth().getUser(uid)
admin.auth().getUserByEmail(email)
admin.auth().getUserByPhoneNumber(phoneNumber)

请看这里https://firebase.google.com/docs/auth/admin/manage-users#retrieve_user_data


简而言之,这就是你要找的东西

admin.auth().getUser(data.uid)
  .then(userRecord => resolve(userRecord.toJSON().email))
  .catch(error => reject({status: 'error', code: 500, error}))

完整的 sn-p

在下面的代码中,我首先通过检查他的uid是否在节点userRights/admin下来验证调用此函数的用户是否有权显示有关任何人的此类敏感信息。

export const getUser = functions.https.onCall((data, context) => {
  if (!context.auth) return {status: 'error', code: 401, message: 'Not signed in'}

  return new Promise((resolve, reject) => {
    // verify user's rights
    admin.database().ref('userRights/admin').child(context.auth.uid).once('value', snapshot => {
      if (snapshot.val() === true) {
        // query user data
        admin.auth().getUser(data.uid)
          .then(userRecord => {
            resolve(userRecord.toJSON()) // WARNING! Filter the json first, it contains password hash!
          })
          .catch(error => {
            console.error('Error fetching user data:', error)
            reject({status: 'error', code: 500, error})
          })
      } else {
        reject({status: 'error', code: 403, message: 'Forbidden'})
      }
    })
  })
})

顺便说一句,了解onCall()onRequest() here 之间的区别。

【讨论】:

  • 您不需要 Firebase 功能。看我的回答:stackoverflow.com/a/66544110/336753
  • @kub1x Admin SDK(您也在您的答案中使用)不能在客户端上运行,如果您只有一个没有服务器的客户端应用程序,那么您唯一的选择(坦率地说是最简单的)是使用一个 Firebase 函数(上面的完整代码)。无论如何,我的解决方案实际上并不需要使用函数。如果你只关心服务器端,那么第一个 sn-p 就是你要找的。函数 sn-p 是一个奖励,它只允许用户将信息返回给客户端。
  • OP 没有指定他是否需要将此作为应用程序逻辑的一部分或作为一次性批处理脚本(如我的情况)。可以从我的计算机调用此类脚本,并且与应用程序基础架构完全分离。当您想要手动启动流程时,编写和部署云函数以及编写和部署客户端代码以调用该函数是很多不必要的工作。它与您的答案不同,但它仍然回答了问题。我很欣慰地发现这不需要云功能,因此发表了评论。
  • 哦,哈哈?,我看到了@kub1x,那就原谅我吧。现在很明显你的解决方案是如何工作的,我错过了,对不起。是的,从这个意义上说,您的解决方案是完美的。我只是假设 OP 需要在某处的代码中使用它,所以我的解决方案允许在服务器和客户端上使用它。我认为,如果他们只需要一次,他们也可以使用 firebase Web 界面,但是您的批处理脚本也是一个有效的解决方案并且可以达到目的。
【解决方案2】:

根据 Firebase 框架的最新更新的当前解决方案:

firebase.auth().currentUser && firebase.auth().currentUser.email

见:https://firebase.google.com/docs/reference/js/firebase.auth.Auth.html#currentuser

每个提供商都没有定义的电子邮件地址,但如果用户使用电子邮件进行身份验证。那么这将是实现上述解决方案的一种可能方式。

【讨论】:

  • 这将如何通过给定 id 提供任何用户的电子邮件?
  • 因为此问题已从“当前用户”重命名为“任何用户”。这是两个非常不同的问题,因为您只能从 Admin SDK(即后端)获取 any 用户的电子邮件。但是,您可以从 当前 用户的会话中获取他们的电子邮件。
  • 原标题是How to get any user object in Firebase based on user id
  • 但是,即使省略了标题的 any 部分,代码仍然没有给出任何电子邮件,而是一个布尔值。下面的句子也没有意义。对我来说,这是一个奇怪的仅支持链接的答案。
  • @LeonidShevtsov 即使省略了标题的 any 部分,问题的主体也清楚表明它应该是任何用户的电子邮件。
【解决方案3】:

要获取当前登录用户的电子邮件地址,请使用getAuth 函数。对于电子邮件和密码/simplelogin,您应该能够收到这样的电子邮件:

ref = new Firebase('https://YourFirebase.firebaseio.com');
email = ref.getAuth().password.email;

在我看来,password 对象的命名不是很贴切,因为它包含 email 字段。

我相信通过 uid 获取任何用户的电子邮件地址并不是 Firebase 的一项功能。当然,这会将所有用户的电子邮件暴露给所有用户。如果您确实想要这样做,您需要在创建帐户时通过他们的 uid 将每个用户的电子邮件保存到数据库中。然后其他用户将能够通过 uid 从数据库中检索电子邮件。

【讨论】:

  • 这是当前登录用户的邮箱。不是您需要的任何用户的电子邮件。
  • 抱歉,我误会了。请看我修改后的答案。
  • 对您修改后的答案的评论:由于显而易见的原因,目前 firebase 数据库不允许在数据库中写入电子邮件。
【解决方案4】:

简单地获取 firebaseauth 实例。 我在 firebase 中创建了一个默认电子邮件和密码。这只是为了安全起见,除了谁知道或谁购买了我们的产品来使用我们的应用程序之外,没有人可以使用。 下一步,我们将为用户帐户创建提供登录屏幕。

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    String email = user.getEmail();

每次用户打开应用程序时,如果当前用户不等于我们的默认电子邮件,用户就会重定向到仪表板。 下面是代码

mAuth = FirebaseAuth.getInstance();
    if (mAuth.getCurrentUser() != null){
        String EMAIL= mAuth.getCurrentUser().getEmail();
            if (!EMAIL.equals("example@gmail.com")){
                startActivity(new Intent(LoginActivity.this,MainActivity.class));
                finish();
            }
    }

我也在寻找相同的解决方案,终于找到了。

【讨论】:

    【解决方案5】:

    当前解决方案(Xcode 11.0)

    Auth.auth().currentUser? ?? "Mail"
    Auth.auth().currentUser?.email ?? "User"
    

    【讨论】:

      【解决方案6】:

      我遇到了同样的问题。需要将 Firestore 中的 email 替换为 uid,以免电子邮件到处存在。 可以使用服务帐户从您计算机上的脚本调用它。您不需要 Firebase 函数

      首先生成服务帐户并下载其 json 密钥。
      Firebase 控制台 > 齿轮图标 > 项目设置 > 服务帐户 > 生成新的私钥按钮。
      https://console.firebase.google.com/u/0/project/MYPROJECT/settings/serviceaccounts/adminsdk

      然后创建项目,添加密钥并调用 Admin SDK。

      1. npm init
      2. npm install dotenv firebase-admin
      3. 将上面的 json 密钥文件放入.keys 目录,保持项目目录中没有密钥文件。还有.gitignore目录。
      4. 将 json 密钥文件的路径写入.env 文件,如下所示:GOOGLE_APPLICATION_CREDENTIALS=".keys/MYPROJECT-firebase-adminsdk-asdf-234lkjjfsoi.json"。我们将使用dotenv 稍后加载它。
      5. 将以下代码写入index.js
      const admin = require('firebase-admin');
      
      admin.initializeApp({
        credential: admin.credential.applicationDefault(),
      });
      
      (async () => {
        const email = "admin@example.com";
        const auth = admin.auth();
        const user = await auth.getUserByEmail(email);
        // Or by uid as asked
        //const user = await auth.getUser(uid);
        console.log(user.uid, user.email);
        //const firestore = admin.firestore();
        // Here be dragons...
      })();
      
      1. 运行如下node -r dotenv/config index.js

      the docs

      【讨论】:

        猜你喜欢
        • 2017-05-30
        • 2019-06-25
        • 1970-01-01
        • 1970-01-01
        • 2017-04-13
        • 1970-01-01
        • 1970-01-01
        • 2012-02-09
        • 1970-01-01
        相关资源
        最近更新 更多