Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 通过Firestore云函数中的uid获取身份验证用户_Node.js_Firebase_Google Cloud Platform_Google Cloud Firestore_Google Cloud Functions - Fatal编程技术网

Node.js 通过Firestore云函数中的uid获取身份验证用户

Node.js 通过Firestore云函数中的uid获取身份验证用户,node.js,firebase,google-cloud-platform,google-cloud-firestore,google-cloud-functions,Node.js,Firebase,Google Cloud Platform,Google Cloud Firestore,Google Cloud Functions,当一个新对象被添加到集合中时,我触发了cloud函数。看起来是这样的: exports.emailAdmin = functions.firestore .document('user-books/{userId}/books/{ASIN}') .onWrite(event => { exports.addNewUserToUserTable = functions.auth.user() .onCreate(event => { let user = event.

当一个新对象被添加到集合中时,我触发了cloud函数。看起来是这样的:

exports.emailAdmin = functions.firestore
  .document('user-books/{userId}/books/{ASIN}')
  .onWrite(event => {
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
    });
event.data.data()
是添加到子集合(“书籍”)中的对象。
userId
来自Firebase身份验证系统。即,用户登录,并使用其“uid”向集合“用户手册”添加对象

我试过:

firestore
    .collection('users')
    .doc(uid)
    .get()
但这“当然”失败了,因为我没有一个名为“用户”的集合。如何访问“身份验证数据库”


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

您的问题似乎不完整-您引用了代码段中未出现的event.data.data()行。你能检查一下吗?如果不见了,可以加上吗

另外,为了明确您的目的,您希望能够访问已通过身份验证的用户的电子邮件地址,并将其标记到该用户添加的书本上


谢谢。

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

exports.emailAdmin = functions.firestore
  .document('user-books/{userId}/books/{ASIN}')
  .onWrite(event => {
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(它适用于实时数据库)。我仍在等待此功能的发布…

导入firebase管理员:

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);

因为
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;
});

事件
是第一个代码段最后一行中提到的第一个也是唯一一个参数。不,其目的是从uid in cloud函数追溯获取用户对象。在此上下文中没有浏览器或登录会话。这样做安全吗?我想从Firestore访问UID,但这不安全,是吗?我在这里没有看到任何安全问题。我的用户集合受firestore安全规则保护,我不会在其中存储任何密码。我希望这能有所帮助。我需要用户访问UID以查看他们创建了哪些博客文章(配置文件)所以我想我不能只制定一个规则,除非我只能从云函数访问它。如果此代码对任何人都不起作用,这里有一个解决方法:@Telion-据我所知,您不允许每个用户只访问创建的用户集合中自己的文档。您可以通过在firestore hock上创建云函数来实现这一点,您只需检查用户是否正在访问自己的ID。唯一的缺点是,您还无法在firestore数据库触发器中获取用户UID(我希望这有道理。)你明白了吗?