Google cloud firestore Firestore GRPC API如何处理多设备中的恢复令牌?
我正在编写一个通过GRPC接口与Firestore对话的客户端。我试图理解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,并且它还
是如何收听的。在这里,您首先通过调用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。因此,从这两个设备,用户正在收听相同的更改。