我使用“ signInWithCustomToken()”来验证firebase用户。
此令牌将在1小时后到期。
Firebase建议令牌到期时间为1小时。如果我们修改了 使用“php-jwt”库,firebase创建自定义令牌时到期 抛出异常“自定义令牌格式不正确。请检查 文件“。
在寻找解决方案时,我发现以下主题 - “Firebase Android Authentication failed: expired_token (Auth token is expired)”
但“ onTokenRefresh()”返回的刷新令牌对我不起作用。
刷新此自定义令牌的步骤是什么?
OR
有没有办法将手动过期设置为自定义令牌?
答案 0 :(得分:11)
Firebase自定义令牌生成存在限制。 Firebase自定义身份验证令牌限制为最大1Hr(3600秒)。
exp 令牌过期的时间(以秒为单位)。它可以在一个 最多比iat晚3600秒。
如果auth令牌每小时到期,我们很难一直维持有效会话:(
当我们使用默认的Auth提供商时(Google,Facebook,Email ..);默认情况下,Firebase SDK会负责刷新您的Auth令牌。但在自定义身份验证中,Firebase SDK需要联系第三方服务器以获取新令牌。 这里只有SDK无法刷新令牌!
我的解决方法是,维持一个"最后一个令牌获取时间"每个地方的信息 成功获取令牌,以便我们可以在一小时后手动刷新令牌。
您可以参考此问题日志了解更多信息,
<强>更新强>
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
是我的班级名称根据你改变它。