在使用Firebase Cloud函数onCreate侦听器设置自定义声明后,如何通知前端需要刷新的前端

时间:2019-07-09 21:13:17

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

我正在尝试使用自定义声明和isUSer侦听器在以onCreate角色注册后初始化用户。我已经设置了正确的自定义声明,但是前端只有在整页刷新后才意识到这一点。

我一直在关注https://firebase.google.com/docs/auth/admin/custom-claims?authuser=0#logic这篇文章,以通知前端它需要刷新令牌才能获得自定义声明对象上的最新更改,但是老实说,我没有非常完全了解本文中发生的事情。

有人可以通过firestore数据库成功地帮助我吗?

这是我当前的云功能:

exports.initializeUserRole = functions.auth.user().onCreate(user => {
    return admin.auth().setCustomUserClaims(user.uid, {
        isUser: true
    }).then(() => {
        return null;
    });
});

我曾尝试将以上文章中提供的实时数据库示例改编为firestore数据库,但未成功。

exports.initializeUserRole = functions.auth.user().onCreate(user => {
    return admin.auth().setCustomUserClaims(user.uid, {
        isUser: true
    }).then(() => {
        // get the user with the updated claims
        return admin.auth().getUser(user.uid);
    }).then(user => {
        user.metadata.set({
            refreshTime: new Date().getTime()
        });
        return null;
    })
});

我以为我可以简单地在用户元数据上设置refreshTime,但是元数据对象上没有这样的属性。

在链接的文章中,提供的metadataRef示例是否实际上不在用户对象上,而是在数据库的其他地方?

const metadataRef = admin.database().ref("metadata/" + user.uid);

如果有人至少可以向我指出如何使本文中的实时数据库示例与Firestore数据库配合使用的正确方向,那将有很大帮助。

如果我的描述不合理或缺少重要信息,请告诉我,我将对其进行修改。

谢谢。

1 个答案:

答案 0 :(得分:0)

该示例使用的格式为metadata/[userID]/refreshTime的路径使用实时数据库中存储的数据。

要在Firestore中执行相同的操作,您将需要创建一个名为metadata的集合,并为每个用户添加一个文档。文档ID将为user.uid的值。这些文档将需要一个名为timestamp的{​​{1}}字段。

此后,您要做的就是在为用户设置了自定义声明后更新相应文档上的该字段。在客户端,您将订阅用户refreshTime文档的更改,并对此进行更新。

这是我在一个项目中的工作方式示例。我相当于 metadata 集合的名称是 userTokens 。在任何步骤失败的情况下,我都使用事务来防止部分数据库更改。

注意::我的函数使用了一些现代的JavaScript语法,这些语法在上载之前已与Babel进行了转译。

metadata