第一次加载页面或用户单击浏览器刷新按钮时都可以运行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) {
//...
}
我在这里想念东西吗?