【问题标题】:Subscribe a user to a topic in Firebase when uid has changed当 uid 更改时,为用户订阅 Firebase 中的主题
【发布时间】:2018-08-30 20:01:51
【问题描述】:

我的问题是: 当我为用户订阅聊天时,假设聊天的 id 为“xDs50Yss70”,用户保持订阅状态,而用户的 Firebase uid 没有更改。 但是,当用户的 Firebase uid 发生变化时,例如当用户删除应用并再次下载时,用户将不再订阅聊天以及他/她可能拥有的其他订阅。

我在第一次创建聊天时使用此功能为用户订阅聊天

function subscribeUserToATopic(registrationTokens, chatId) {
    return admin.messaging().subscribeToTopic(registrationTokens, chatId)
}

如我们所见,我们使用注册令牌为用户订阅chatId,我使用从这段代码中获得的注册令牌(在客户端):

@Override
public void onNewToken(String newToken) {
    super.onNewToken(newToken);

    // Send the new token to Firestore
    sendTokenToDatabase(newToken);
}

我使用sendTokenToDatabase() 将令牌发送到 Firestore 数据库,但是当用户删除应用程序并重新安装它时,令牌会更改...而且我不再可以使用此代码发送推送通知,因为用户的令牌已更改:

admin.messaging().sendToTopic(chatId, payload, options).then(() => {
        console.log(`Push notification sent to the user(s) subscribed to the ${chatId}`)
    }).

【问题讨论】:

  • 您使用什么类型的身份验证?对于电子邮件/密码和通过社交提供商进行的身份验证,即使用户重新安装应用,Firebase UID 仍将保持不变。
  • 我只使用 Google 和 Facebook 身份验证。
  • 这意味着用户的 UID 是相同的,即使他们卸载/重新安装应用程序、从网站登录等等。

标签: android firebase firebase-cloud-messaging firebase-admin


【解决方案1】:

您所指的令牌是device registration token。它可以在以下事件中发生变化:

  • 应用删除实例 ID
  • 应用已在新设备上恢复
  • 用户卸载/重新安装应用程序
  • 用户清除应用数据

在每种情况下,您都需要获取新的注册令牌,并将其订阅到您关心的主题。希望以上所有事件对于任何给定用户来说都是罕见的,因此您不必经常这样做。

现在您似乎代表了一个带有主题的聊天(我假设这就像您应用中的特定对话或聊天室)。因此,您的主题可能因用户而异。这意味着您还必须独立跟踪每个用户的主题。存储每个用户的聊天/主题列表,由他们在数据库中的唯一 UID 键入。 UID 始终保持不变,因此您不必担心它们会随时间变化。

【讨论】:

    【解决方案2】:

    我能想到两种可能的解决方案。他们都喜欢在调用 onNewToken 方法时再次设置订阅,或者对于以前版本的 FCM,使用 onTokenRefresh 方法。

    所以你需要做的是获取用户订阅的主题列表,然后为每个主题再次subscribeToTopic。如果你的服务器上有它们,你可以从那里获取它们,或者你可以将它们本地存储在用户的设备上(即 SharedPreferences、数据库等)检索它们并重新设置它们。

    【讨论】:

      【解决方案3】:

      当用户首次使用电子邮件+密码或其中一个社交服务提供商(如 Facebook、Google 等)登录 Firebase 身份验证时,会为其帐户确定一个唯一的 UID。因为在那之后,这个 UID 保持不变,直到您删除他们的帐户。这意味着如果用户卸载并重新安装应用程序,他们将在登录时获得相同的 UID。

      【讨论】:

      • 哦,好吧...所以 Firebase 令牌独立于用户的 uid... 但是,当令牌发生更改时,我如何重新订阅用户到以前的主题。据我所知,由于多种原因,令牌会发生变化
      • 很难理解你现在实际在做什么。我建议您使用最少的代码来更新您的问题,以重现您所询问的内容。例如,显示您如何登录和订阅。
      【解决方案4】:

      这是对 Frank 答案的扩展,基于您对 Token 的更新问题。

      Firebase ID 令牌仅在发生以下任一情况时才会过期:

      1. 用户被删除
      2. 用户被禁用
      3. 检测到用户的重大帐户更改。这包括密码或电子邮件地址更新等事件。

      这不是您的情况,因此,此时,您需要做的是REVOKE 刷新令牌

      撤销刷新令牌

      您可以撤销用户现有的刷新令牌 当用户报告设备丢失或被盗时。同样,如果你 发现一般漏洞或怀疑大规模泄漏 活动令牌,您可以使用 listUsers API 来查找所有用户和 撤销他们对指定项目的令牌。

      密码重置也会撤销用户现有的令牌;然而 Firebase 身份验证后端自动处理撤销 在这种情况下。撤销时,用户退出并提示 重新认证。

      有关实现和文档的完整详细信息,请参阅文档 here。 (冗长)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多