在uid更改后,将用户订阅到Firebase中的主题

问题描述 投票:0回答:4

我的问题是:当我订阅用户聊天时,假设聊天的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}`)
    }).
android firebase firebase-cloud-messaging firebase-admin
4个回答
1
投票

你所指的令牌是device registration token。它可以在以下事件中更改:

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

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

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


1
投票

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

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


1
投票

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


1
投票

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

仅当出现以下情况之一时,Firebase ID令牌才会过期:

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

这不是你的情况,所以,在这一点上,你需要做的是REVOKE刷新令牌。

撤消刷新令牌

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

密码重置也会撤消用户现有的令牌;但是,Firebase身份验证后端在这种情况下会自动处理撤销。撤销时,用户已注销并提示重新进行身份验证。

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

© www.soinside.com 2019 - 2024. All rights reserved.