可以在页面加载时获取新的Firebase ID令牌吗?

时间:2020-02-19 03:18:22

标签: firebase firebase-authentication

第一次加载页面或用户单击浏览器刷新按钮时都可以运行user.getIdToken(true)吗?我应该注意的任何性能,安全性或其他问题吗?


更多细节

我依靠自定义声明来处理用户角色。正如道格在his Medium post中所建议的那样,我确保使用user.getIdToken(true)获取新的ID令牌:

let lastCommitted
function onNewClaims(snapshot) {
    const data = snapshot.data()
    console.log('New claims doc\n', data)
    if (data._lastCommitted) {
        if (lastCommitted &&
              !data._lastCommitted.isEqual(lastCommitted)) {
            // Force a refresh of the user's ID token
            console.log('Refreshing token')
            currentUser.getIdToken(true)
        }
        lastCommitted = data._lastCommitted
    }
}

但是据我了解,此代码段仅在用户当前 在应用程序中时触发。如果在用户不在时(例如关闭的标签页)更新了声明,则他们不会收到新的更新。我浏览了文档,找不到关于getIdToken的最佳实践。

由于ID令牌持续一个小时,并且在用户注销并重新登录后会得到更新,因此我感觉我在强制刷新ID令牌中做得太频繁了。 (用户可能会刷新5-100次或更多次,并且ID令牌每次都会刷新)


编辑

这是一个用例示例:一个项目管理应用程序(例如Trello),用户可以属于不同的团队工作区。管理员用户可以邀请用户或为他们分配不同的角色。然后将角色存储为个人用户的自定义声明(例如[teamId]:“成员”)。

如果用户当前在应用程序中,则user.getIdToken会在声明更新时被调用。 (例如,管理员将用户的角色从“成员”更改为“管理员”),但是如果用户不在应用程序中,则不会调用任何内容。当他们回来时,他们在Firestore文档中的声明是最新的(“管理员”),而他们的实际声明不是(“成员”),因为强制刷新逻辑不会页面加载时不会被触发。

据我了解,auth.onIdTokenChanged从未被调用,因为user.getIdToken(客户端上的强制刷新)没有被调用。所以我认为这可能更有意义:

const updated = lastCommitted && !data._lastCommitted.isEqual(lastCommitted)
let loaded = false // set to true when app starts/restarts (page refresh)

// Instead of this
if (updated) {
 //...
}

// Do this?
if (!loaded || updated) {
 //...
}

我在这里想念东西吗?

0 个答案:

没有答案