如何使用Firebase身份验证检索服务器端的刷新令牌?

时间:2018-02-02 08:44:52

标签: firebase firebase-authentication firebase-admin

我需要为Firebase应用实施单设备浮动许可,用户一次只能在一台设备上登录该应用。因此,当用户从其他设备登录时,该用户的其他现有登录应该无效。

以下是我正在考虑的流程:

  1. 登录后,从客户端发送Firebase idToken ,以便在允许访问之前在服务器上进行验证
  2. 在服务器端,使用verifyIdToken()并为用户检索 refreshToken 并存储
  3. 如果 refreshToken 已从先前存储的用户值更改,则使用revokeRefreshTokens()
  4. 使其他刷新令牌无效

    此方法存在的问题是,目前,Firebase Admin SDK中verifyIdToken()返回的 DecodedIdToken 对象没有 refreshToken 可用。并且revokeRefreshTokens()不接受为用户指定要撤消的刷新令牌。默认情况下,它会撤消截至目前用户的所有刷新令牌。

    需要注意的另一点是,虽然用户对象中的 refreshToken 在客户端可用,但我们无法将其直接发送到服务器端它可以在客户端进行操作,以便从多个设备发送相同的 refreshToken ,这会破坏目的。更好的方法是发送具有有限到期时间的 idToken

    那么,对于如何使用Firebase身份验证一次只在一台设备上实现主动登录,还有其他替代方案/建议吗?

1 个答案:

答案 0 :(得分:1)

由于正确的原因,您无法从ID令牌获取refreshToken。如果从idToken检索它,则没有意义。

使用revokeRefreshTokens实现单个会话也很困难,因为这将撤销所有现有会话,对于防止令牌盗窃而非会话管理更有用。

您可以做的是以下内容。每次将ID令牌发送到您的服务器时,从解码的令牌解析auth_time并跟踪它(您将保存最新的令牌)。这是会话的身份验证时间。从同一idTokens生成的所有refreshToken将具有相同的auth_time。您将始终跟踪最新的auth_time,并且只要您获得一个较早的auth_time的ID令牌,请考虑该会话被撤销并阻止对该会话的访问。当发生这种情况时,您可以返回错误消息以强制signOut