【问题标题】:Firebase: Why am I getting Firebase ID Tokens twice?Firebase:为什么我会两次获得 Firebase ID 令牌?
【发布时间】:2018-07-14 08:22:08
【问题描述】:

问题

从以下情况,我可以看到两种不同的标记:

  • 完成注册后,我获得了第一个 Firebase ID 令牌。
  • 当我在完全退出后回到我的应用时,我会获得一个新的 JWT。

我发现了什么

const app = express();

app.use((req, res, next) => {
  if (!req.headers.authorization) 
    return res.status(403).json({ message: 'Missing Authorization Header' });

  const jwt = req.headers.authorization.trim();

  return admin.auth().verifyIdToken(jwt).then((decodedToken) => {
    const uid = decodedToken.uid; // Exists
    const displayName = decodedToken.name; // No displayName, object Undefined
    const photoURL = decodedToken.picture; // No photoURL, object Undefined
    next();
  });
});

尽管我通过调用下面的函数更新了用户的默认配置文件,但 ID 令牌似乎不包含用户的 displayNamephotoURL

initializeUserProfile(name: string, photoURL: string) {
  let data = {
    displayName: name,
    photoURL: photoURL
  };

  this.afAuth.auth.currentUser.updateProfile(data).then(() => {
    this.getUsersRef(this.currentUserId).update(data); // Save data to firestore
  }).catch((err) => console.log(err));
}

注意:退出并成功登录应用后,token的长度会比之前的token长很多。此外,它还包含displayNamephotoURL

我也发布了我的相关问题here,似乎是令牌导致了问题。

为什么我会得到一个新的令牌?我该如何解决这个问题?

【问题讨论】:

  • 您没有提供全部信息。目前尚不清楚您如何注销用户。那篇文章可以阐明这个问题。 Firebase Auth 等待状态得到解决,然后再注销用户。这确保没有竞争条件(在确定初始状态后完成退出)。我推测这就是原因。
  • 我认为您没有正确回答我的问题。在我手动退出应用程序然后再次登录应用程序后,令牌已更改。因此,我相信退出用户不是问题。
  • 我认为即使调用initializeUserProfile(),状态也不会更新。
  • 登录用户将返回一个新会话,其中包含一个具有完整生命周期的新 ID 令牌。不知道这里有什么问题。
  • @bojeil 如何在用户配置文件更新时使用新的 ID 令牌获取新会话?调用initializeUserProfile() 方法后。有什么想法吗?

标签: javascript firebase firebase-authentication jwt


【解决方案1】:

要在通过updateProfile 更新配置文件后获取具有最新声明的新 ID 令牌,您只需调用:currentUser.getIdToken(true) 强制令牌刷新即可。

请注意,当令牌过期时,自然在令牌刷新时,新令牌将自动获取最新的声明以及配置文件更改。要立即获取此信息,您可以强制刷新。

【讨论】:

  • 我在错误的位置拨打了getIdToken(true)。你已经指出了实际的问题是什么。不错的收获!再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
  • 1970-01-01
  • 2017-01-24
  • 2021-09-07
  • 2017-11-05
  • 2018-05-28
相关资源
最近更新 更多