admin.auth()currentUser。在云函数

时间:2018-05-08 14:16:58

标签: javascript firebase firebase-authentication google-cloud-firestore google-cloud-functions

我正在尝试创建一个函数,当设备在应用程序中注册时,会将此设备uid附加到注册设备的已登录用户的uid(这是在另一个自动创建的firestore集合中)当用户注册时)。

这是我的代码:



exports.addDeviceToUser = functions.firestore.document('device-names/{device}').onUpdate((change, context) => {
    const currentUser = admin.auth().currentUser;
    const deviceName = context.params.device;
    var usersRef = db.collection('users');
    var queryRef = usersRef.where('uid', '==', currentUser.uid);

    if (authVar.exists) {
        return queryRef.update({sensors: deviceName}).then((writeResult => {
        return console.log('Device attached');
        }));
    } else {return console.log('Device attachment failed, user not signed in');}
});




我一直收到此错误:" TypeError:无法读取属性' uid'未定义的。"显然我无法访问当前用户的身份验证信息。为什么呢?

2 个答案:

答案 0 :(得分:4)

Admin SDK没有当前用户的感觉。当您说admin.auth()时,您将获得一个Auth对象。从API文档中可以看出,它上面没有currentUser属性。只有Firebase客户端SDK具有当前用户感,因为您使用它来让用户登录。

如果您需要客户端应用程序告诉Cloud Functions代码使用用户的身份,您必须从客户端向其发送ID令牌,并在服务器上验证它。然后,服务器可以知道最终用户是谁,并代表他们执行操作。通常,您使用HTTP类型触发器执行此操作。 Callable functions在客户端和服务器之间自动传输此数据,但您可以使用类似this sample的代码自行手动执行此操作。

目前,Firestore触发器无法立即访问在数据库中进行更改的最终用户。但是,如果您使用用户的Auth UID作为文档的密钥,并使用安全规则保护该文档,则至少可以根据用户对文档所做的更改来推断用户的UID。已更改的文档的ID。

答案 1 :(得分:3)

因为,根据设计,云功能在后端执行,并且在添加/修改数据库中的数据时不保存有关用户通过身份验证的任何信息。

'device-names/{device}'文档(从您的应用程序)中编写数据时,您可以包含一个额外的数据,这是当前用户的uid。