admin.auth().currentUser; 在 Cloud Functions 中返回 undefined

Aar*_*ron 0 javascript firebase firebase-authentication google-cloud-functions google-cloud-firestore

我正在尝试创建一个函数,当设备在应用程序中注册时,会将这个设备 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');}
});
Run Code Online (Sandbox Code Playgroud)

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

Dou*_*son 5

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

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

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

  • @opyate 该文档适用于 Web 客户端 SDK,它与服务器端代码的管理 SDK 不同。它们不具有相同的功能。 (3认同)