如何在Firebase 3.x.x中处理自定义firebase令牌到期

时间:2016-07-13 11:45:51

标签: android firebase firebase-authentication

我使用“ signInWithCustomToken()”来验证firebase用户。

此令牌将在1小时后到期。

  

Firebase建议令牌到期时间为1小时。如果我们修改了   使用“php-jwt”库,firebase创建自定义令牌时到期   抛出异常“自定义令牌格式不正确。请检查   文件“。

在寻找解决方案时,我发现以下主题 - “Firebase Android Authentication failed: expired_token (Auth token is expired)

但“ onTokenRefresh()”返回的刷新令牌对我不起作用。

刷新此自定义令牌的步骤是什么?

OR

有没有办法将手动过期设置为自定义令牌?

4 个答案:

答案 0 :(得分:11)

Firebase自定义令牌生成存在限制。 Firebase自定义身份验证令牌限制为最大1Hr(3600秒)。

  

exp 令牌过期的时间(以秒为单位)。它可以在一个   最多比iat晚3600秒。

如果auth令牌每小时到期,我们很难一直维持有效会话:(

当我们使用默认的Auth提供商时(Google,Facebook,Email ..);默认情况下,Firebase SDK会负责刷新您的Auth令牌。但在自定义身份验证中,Firebase SDK需要联系第三方服务器以获取新令牌。 这里只有SDK无法刷新令牌!

  

我的解决方法是,维持一个"最后一个令牌获取时间"每个地方的信息   成功获取令牌,以便我们可以在一小时后手动刷新令牌。

您可以参考此问题日志了解更多信息,

  1. https://github.com/firebase/quickstart-android/issues/31
  2. In Firebase 9.0.0 API, how to check the user has valid Auth session or not?
  3. <强>更新

    Google更新了他们的文档,

      

    exp(到期时间):自UNIX时代以来令牌到期的时间(以秒为单位)。最长可达3600秒   比iat。 (注意:这仅控制自定义令牌的时间   本身到期。但是一旦你签署用户使用   signInWithCustomToken(),它们将保持登录到设备中   直到他们的会话无效或用户退出。)

    document所述,自定义JWT令牌对max 1Hr有效;所以在它过期之前,请使用Firebase对您的用户进行身份验证。之后会议将保持活跃;它不会过期!

    您可以使用以下方法确保用户具有有效会话

    public static boolean hasValidAuthToken() {
        return FirebaseAuth.getInstance().getCurrentUser() != null ? true : false;
    }
    

    希望这会对你有帮助!

答案 1 :(得分:0)

如果正确设置,SDK将负责使令牌保持最新状态。 For more info自定义标记仅用于启动SESSION。因此,您必须花费数小时才能使用自定义令牌登录。登录并正确设置Firebase管理员帐户和应用程序配置后,SDK即可与Firebase后端进行来回通信,以使令牌保持最新状态。使用FirebaseAuth.signout()退出后,如果超过1小时,则需要一个新的自定义令牌重新登录。

答案 2 :(得分:0)

类似这样的方法是一种检查令牌并查看其是否过期的方法。然后,您可以铸造一个新的

public async Task<string> GetIdTokenAsync()
{
  // Get current time in seconds from Epoch
  var secondsSinceEpoch = DateTimeOffset.UtcNow.ToUnixTimeSeconds();

  // We have already minted a token for this session, so check if we need a new one 
  if (this.idToken != null)
  {
    // Check to see if current token is expired or will expire soon
    var idTokenExpiration = JwtDecoder.TokenExpirationTime(this.idToken);
    if (idTokenExpiration > (secondsSinceEpoch - 60L))
    {
      return this.idToken;
    }
  }

  // No id token for this session, or we have an id token, but its expired, so mint a new one
  this.idToken = await auth?.CurrentUser?.GetIdTokenAsync(true);
  return this.idToken;
}

答案 3 :(得分:-7)

您可以使用此代码获取刷新令牌

FirebaseInstanceId.getInstance().getToken();

FirebaseInstanceId是我的班级名称根据你改变它。