如何根据用户ID在Firebase中获取用户电子邮件

时间:2015-04-27 07:31:30

标签: firebase

我需要获取用户对象,特别是用户电子邮件,我将使用以下格式的用户ID:

simplelogin:6

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

getUserEmail('simplelogin:6')

这可能吗?

5 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:4)

使用Admin SDK似乎有可能,您可以实现以下承诺:

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

在此处查看https://firebase.google.com/docs/auth/admin/manage-users#retrieve_user_data


//编辑13.7。

简而言之,这就是您要寻找的

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

完整代码段

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) => {
    admin.database().ref('userRights/admin').child(context.auth.uid).once('value', snapshot => {
      if (snapshot.val() === true) {
        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'})
      }
    })
  })
})

在上面的代码中,我首先验证调用此函数的用户是否可以显示有关任何人的此类敏感信息(我检查其uid是否在节点userRights/admin下)。

答案 2 :(得分:1)

对于正在寻找现代答案的任何人-Google Firebase,这非常简单:

firebase.auth.currentUser && firebase.auth.currentUser.email

请参阅https://firebase.google.com/docs/reference/js/firebase.auth.Auth.html#currentuser

我认为并非每个提供商都将填写电子邮件字段,但是电子邮件提供商肯定会填写。

答案 3 :(得分:0)

当前解决方案(Xcode 11.0)

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

答案 4 :(得分:0)

我遇到了同样的问题。需要将 Firestore 中的 =Filter(flatten(B2:I12),Not(ISBLANK(Flatten(B2:I12)))) 替换为 email,以免电子邮件随处可见。 可以使用服务帐户从您计算机上的脚本调用它。为此,您不需要 Firebase 函数

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

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

  1. uid
  2. npm init
  3. 将上面的 json 密钥文件放入 npm install dotenv firebase-admin 目录,保持项目目录中没有密钥文件。还有 .keys 目录。
  4. 将json密钥文件的路径写入.gitignore文件中,如下所示:.env。我们稍后将使用 GOOGLE_APPLICATION_CREDENTIALS=".keys/MYPROJECT-firebase-adminsdk-asdf-234lkjjfsoi.json" 加载它。
  5. 将以下代码写入 dotenv
index.js
  1. 运行如下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... })();

the docs