「signInWithCustomToken()」を使用して、Firebaseユーザーを認証しました。
このトークンは1時間で有効期限が切れます。
Firebaseは、トークンの有効期限を1時間に推奨しています。 「php-jwt」ライブラリを使用してカスタムトークンを作成しているときに有効期限を変更すると、firebaseから「カスタムトークンの形式が正しくありません。ドキュメントを確認してください」という例外がスローされます。
解決策を検索していると、次のスレッドが見つかりました-" Firebase Android Authentication failed:expired_token(Auth token is expired)
しかし、「onTokenRefresh()」によって返された更新されたトークンは、私には機能しません。
このカスタムトークンを更新する手順は何ですか?
OR
カスタムトークンに手動の有効期限を設定する方法はありますか?
Firebaseカスタムトークンの生成には制限があります。 Firebaseカスタム認証トークンは、最大1時間(3600秒)に制限されています。
expトークンの有効期限が切れる時間(秒単位)。 iatより最大3600秒遅れることがあります。
認証トークンが1時間ごとに期限切れになると、有効なセッションを常に維持することが難しくなります:(
(Google、Facebook、Eメールなど)のようなデフォルトの認証プロバイダーを使用する場合。 Firebase SDKは、デフォルトで認証トークンの更新を処理します。ただし、カスタム認証では、Firebase SDKはサードパーティサーバーに接続して新しいトークンを取得する必要があります。ここでは、SDKだけがトークンの更新に失敗しています!
私の回避策は、トークンのフェッチが成功するたびにローカルで「last-token-fetch-time」情報を維持し、1時間後に手動でトークンを更新できるようにすることです。
詳細については、この問題ログを参照できます。
更新:
Googleは彼らの文書を更新しました、
exp(有効期限):トークンが期限切れになるUNIXエポックからの秒数。 iatより最大で3600秒遅れることがあります。 (注:これはカスタムトークン自体の有効期限のみを制御します。ただし、signInWithCustomToken()を使用してユーザーにサインインすると、セッションが無効になるか、ユーザーがログアウトするまで、ユーザーはデバイスにサインインしたままになります。)
document が言うように、カスタムJWTトークンは最大1時間有効です。そのため、有効期限が切れる前に、Firebaseでユーザーを認証してください。その後、セッションはアクティブのままになります。有効期限はありません!
以下の方法を使用して、ユーザーが有効なセッションを持っていることを確認できます。
public static boolean hasValidAuthToken() {
return FirebaseAuth.getInstance().getCurrentUser() != null ? true : false;
}
これがあなたに役立つことを願っています!
正しくセットアップされていれば、SDKがトークンを最新の状態に保ちます。 詳細 カスタムトークンは、セッションの開始にのみ使用されます。したがって、カスタムトークンを使用してサインインするには1時間かかる必要があります。サインインしてFirebase管理者アカウントとアプリの構成が正しく設定されると、SDKはFirebaseバックエンドと相互に通信して、トークンを最新の状態に保つことができます。 FirebaseAuth.signout()でログアウトした後、1時間以上経過した場合は、再度サインインするための新しいカスタムトークンが必要になります。
このようなものは、トークンをチェックして、期限切れかどうかを確認する方法です。その後、新しいものを造ることができます
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;
}