我需要为Firebase应用实施单设备浮动许可,用户一次只能在一台设备上登录该应用。因此,当用户从其他设备登录时,该用户的其他现有登录应该无效。
以下是我正在考虑的流程:
verifyIdToken()
并为用户检索 refreshToken 并存储revokeRefreshTokens()
此方法存在的问题是,目前,Firebase Admin SDK中verifyIdToken()
返回的 DecodedIdToken 对象没有 refreshToken 可用。并且revokeRefreshTokens()
不接受为用户指定要撤消的刷新令牌。默认情况下,它会撤消截至目前用户的所有刷新令牌。
需要注意的另一点是,虽然用户对象中的 refreshToken 在客户端可用,但我们无法将其直接发送到服务器端它可以在客户端进行操作,以便从多个设备发送相同的 refreshToken ,这会破坏目的。更好的方法是发送具有有限到期时间的 idToken 。
那么,对于如何使用Firebase身份验证一次只在一台设备上实现主动登录,还有其他替代方案/建议吗?
答案 0 :(得分:1)
由于正确的原因,您无法从ID令牌获取refreshToken
。如果从idToken
检索它,则没有意义。
使用revokeRefreshTokens
实现单个会话也很困难,因为这将撤销所有现有会话,对于防止令牌盗窃而非会话管理更有用。
您可以做的是以下内容。每次将ID令牌发送到您的服务器时,从解码的令牌解析auth_time
并跟踪它(您将保存最新的令牌)。这是会话的身份验证时间。从同一idTokens
生成的所有refreshToken
将具有相同的auth_time
。您将始终跟踪最新的auth_time
,并且只要您获得一个较早的auth_time
的ID令牌,请考虑该会话被撤销并阻止对该会话的访问。当发生这种情况时,您可以返回错误消息以强制signOut
。