Google cloud firestore Firestore GRPC API如何处理多设备中的恢复令牌?

Google cloud firestore Firestore GRPC API如何处理多设备中的恢复令牌?,google-cloud-firestore,grpc,Google Cloud Firestore,Grpc,我正在编写一个通过GRPC接口与Firestore对话的客户端。我试图理解是如何收听的。在这里,您首先通过调用Firestore.listen来创建一个双向通道。然后用ListenRequest为其提供信息。每个ListenRequest都包含一个所谓的Target,它表示一个查询或一个您希望了解其更改的文档列表 为了能够处理网络连接问题,每个Target都有一个targetId,它只是一个int。服务器将以流式方式发送消息,通知您在服务器端添加了具有特定targetId的Target,并且它还

我正在编写一个通过GRPC接口与Firestore对话的客户端。我试图理解
是如何收听的。在这里,您首先通过调用
Firestore.listen来创建一个双向通道。然后用
ListenRequest
为其提供信息。每个
ListenRequest
都包含一个所谓的
Target
,它表示一个查询或一个您希望了解其更改的文档列表

为了能够处理网络连接问题,每个
Target
都有一个
targetId
,它只是一个
int
。服务器将以流式方式发送消息,通知您在服务器端添加了具有特定
targetId
Target
,并且它还将返回所谓的
resumeToken
。因此,下次如果您的连接断开,您可以创建一个新的双向通道,并再次添加那些
Target
s,您还可以指定
resumeToken
,以便它们在您的连接断开之前为您提供正确的状态


但我不明白他们如何处理一个用户拥有多台设备的情况。假设在设备A上,用户使用targetId 1创建一个目标,从而获得一个resumeToken A。在设备B上,用户创建另一个目标(不同的查询)并将其分配给targetId 1,从而获得另一个resumeToken B。现在假设设备A重新连接,并提供targetId 1和resumeToken A,这会混淆Firestore服务器吗?由于服务器上有两个目标具有相同的targetId 1,但它们属于两个不同的查询,Firestore服务器是否足够聪明,知道带有resumeToken A的targetId 1属于查询A?

我建议查看以了解Fireabase身份验证如何处理用户会话。引用文件:

每次用户登录时,都会将用户凭据发送到 Firebase身份验证后端,并交换Firebase ID令牌 (JWT)和刷新令牌。Firebase ID令牌的寿命很短且持续时间很长 一个小时;刷新令牌可用于检索新的ID令牌。 刷新令牌仅在以下情况之一发生时过期:

  • 用户将被删除
  • 用户已被禁用
  • 检测到用户的主要帐户更改。这包括以下活动: 密码或电子邮件地址更新
更新:


为了解决从多个设备登录的问题,您可以将为每个设备生成的恢复令牌存储在数据库中,并发送仅对新设备有效的不透明cookie。

我建议查看以了解Firebase身份验证如何处理用户会话。引用文件:

每次用户登录时,都会将用户凭据发送到 Firebase身份验证后端,并交换Firebase ID令牌 (JWT)和刷新令牌。Firebase ID令牌的寿命很短且持续时间很长 一个小时;刷新令牌可用于检索新的ID令牌。 刷新令牌仅在以下情况之一发生时过期:

  • 用户将被删除
  • 用户已被禁用
  • 检测到用户的主要帐户更改。这包括以下活动: 密码或电子邮件地址更新
更新:


为了解决从多个设备登录的问题,您可以将为每个设备生成的恢复令牌存储在数据库中,并发送仅对新设备有效的不透明cookie。

谢谢,但我想我说的是另一件事。在Firestore的GRPC接口中,有一个
listen
功能,您需要提供JWT才能建立双向GRPC通道,然后在该通道中发送查询等目标。查询首先有一些当前快照,然后是数据库增量,如文档修改和删除。如果GRPC通道断开连接,它们会引入一个“恢复令牌”,因此下次您发送目标和恢复令牌时,它们将从停止的位置继续。现在的问题是,目标id只是一个简单的int,这个int目标id由客户端决定,我的问题是,如果同一个目标id属于同一个客户端或不同的客户端,Firestore服务器端如何区分?我现在明白了,您在问Firestore如何处理登录的同一用户所做的更改,在两个不同的设备中。一旦用户通过身份验证,您的应用程序将使用他的凭据来调用API。因此,用户在两台设备上都听到了相同的变化。谢谢,但我想我说的是另一件事。在Firestore的GRPC接口中,有一个
listen
功能,您需要提供JWT才能建立双向GRPC通道,然后在该通道中发送查询等目标。查询首先有一些当前快照,然后是数据库增量,如文档修改和删除。如果GRPC通道断开连接,它们会引入一个“恢复令牌”,因此下次您发送目标和恢复令牌时,它们将从停止的位置继续。现在的问题是,目标id只是一个简单的int,这个int目标id由客户端决定,我的问题是,如果同一个目标id属于同一个客户端或不同的客户端,Firestore服务器端如何区分?我现在明白了,您在问Firestore如何处理登录的同一用户所做的更改,在两个不同的设备中。一旦用户通过身份验证,您的应用程序将使用他的凭据来调用API。因此,从这两个设备,用户正在收听相同的更改。