在Firestore云功能中通过其uid获取auth用户

时间:2017-11-05 02:32:08

标签: firebase google-cloud-firestore

我在将新对象添加到集合时触发了云功能。它看起来像这样:

exports.emailAdmin = functions.firestore
  .document('user-books/{userId}/books/{ASIN}')
  .onWrite(event => {

event.data.data()是添加到子集合(“书籍”)的对象。 userId来自Firebase身份验证系统。即用户已登录,并使用他/她的“uid”将对象添加到“user-books”集合中。

我试过了:

firestore
    .collection('users')
    .doc(uid)
    .get()

但是,“当然”,因为没有名为“用户”的集合而失败。我如何进入“认证数据库”?

目的是将“uid”转换为该人的“电子邮件”。

4 个答案:

答案 0 :(得分:3)

导入firebase-admin:

import * as admin from 'firebase-admin';

然后获取身份验证用户:

const uid = ...;
const authUser = await admin.auth().getUser(uid); // this returns a promise, so use await or .then()

console.log(authUser.email);

答案 1 :(得分:2)

您无权访问firebase中的用户集合。我所做的是创建一个单独的用户表,我存储所有用户数据。我在onCreate Hook上将新用户添加到我的集合中,如下所示:

exports.addNewUserToUserTable = functions.auth.user()
.onCreate(event => {
    let user = event.data;
    let database = admin.firestore();

    return database.collection('user').doc(user.uid).set({
        email: user.email
    });

另一个问题是,目前无法在Firestore数据库触发器上获取登录用户的ID(它适用于实时数据库)。我还在等待这个功能发布......

答案 2 :(得分:0)

似乎您的问题可能不完整 - 您引用了一个没有出现在您的代码段中的event.data.data()行。如果它丢失了,您可以查看并添加吗?

另外,为了澄清您的目的,您希望能够访问已经过身份验证的用户的电子邮件地址,并将其标记为该用户添加的图书?

感谢。

答案 3 :(得分:0)

由于context.auth.uid无法用于Firestore。您可以为文档分配userId并在规则中阅读。

match /collectionA/{docId} {
  allow update: if request.resource.data.userId == request.auth.uid;
}

exports.createProfile = functions.firestore
.document('collectionA/{docId}')
.onCreate((snap, context) => { // or onUpdate
  const newValue = snap.data();
  const {userId} = newValue;
});