【问题标题】:admin.auth().currentUser; returning undefined in Cloud Functionadmin.auth().currentUser;在云函数中返回未定义
【发布时间】:2018-10-18 12:53:42
【问题描述】:

我正在尝试创建一个函数,当设备在应用程序中注册时,会将此设备 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'。”显然我无法访问当前用户的身份验证信息。为什么?

【问题讨论】:

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


    【解决方案1】:

    因为按照设计,Cloud Functions 在后端执行,并且在添加/修改数据库中的数据时不保存任何关于哪个用户通过身份验证的信息。

    'device-names/{device}' 文档(来自您的应用程序)中写入数据时,您可以包含一条额外的数据,即当前用户的 uid。

    【讨论】:

    • 如果无法访问用户的uid,如何添加到{device}节点?在我的应用端?
    • 确实如此。写入数据时(来自您的 rapp),您包含一个额外的数据,即当前用户的 uid。
    • 仅供参考,此功能显然已在 Firebase 团队的路线图中,请参阅 stackoverflow.com/questions/49993552/…
    • 太棒了。我现在将实施您的解决方案,直到 Firebase 实施该功能,但由于 Doug Stevenson 的回答似乎是最“正确”的方法,我正在检查他的回答。
    • 如果您需要检查用户信息,请使用安全规则进行验证。
    【解决方案2】:

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

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

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

    【讨论】:

    • 太棒了!谢谢你。这似乎是目前解决问题的“真实”方式。我认为现在就我的目的而言,我将接受 Renaud Tarnec 的回答。
    • 道格,你是说这里的文档有误吗? firebase.google.com/docs/auth/web/… 它提到了firebase.auth().currentUser
    • @opyate 该文档用于 Web 客户端 SDK,与用于服务器端代码的管理 SDK 不同。它们没有相同的功能。
    猜你喜欢
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多