web-dev-qa-db-ja.com

Firebase 3.x.xでカスタムFirebaseトークンの期限切れを処理する方法

signInWithCustomToken()」を使用して、Firebaseユーザーを認証しました。

このトークンは1時間で有効期限が切れます。

Firebaseは、トークンの有効期限を1時間に推奨しています。 「php-jwt」ライブラリを使用してカスタムトークンを作成しているときに有効期限を変更すると、firebaseから「カスタムトークンの形式が正しくありません。ドキュメントを確認してください」という例外がスローされます。

解決策を検索していると、次のスレッドが見つかりました-" Firebase Android Authentication failed:expired_token(Auth token is expired)

しかし、「onTokenRefresh()」によって返された更新されたトークンは、私には機能しません。

このカスタムトークンを更新する手順は何ですか?

OR

カスタムトークンに手動の有効期限を設定する方法はありますか?

15
Varsha P

Firebaseカスタムトークンの生成には制限があります。 Firebaseカスタム認証トークンは、最大1時間(3600秒)に制限されています。

expトークンの有効期限が切れる時間(秒単位)。 iatより最大3600秒遅れることがあります。

認証トークンが1時間ごとに期限切れになると、有効なセッションを常に維持することが難しくなります:(

(Google、Facebook、Eメールなど)のようなデフォルトの認証プロバイダーを使用する場合。 Firebase SDKは、デフォルトで認証トークンの更新を処理します。ただし、カスタム認証では、Firebase SDKはサードパーティサーバーに接続して新しいトークンを取得する必要があります。ここでは、SDKだけがトークンの更新に失敗しています!

私の回避策は、トークンのフェッチが成功するたびにローカルで「last-token-fetch-time」情報を維持し、1時間後に手動でトークンを更新できるようにすることです。

詳細については、この問題ログを参照できます。

  1. https://github.com/firebase/quickstart-Android/issues/31
  2. Firebase 9.0.0 APIでは、ユーザーが有効な認証セッションを持っているかどうかを確認する方法

更新:

Googleは彼らの文書を更新しました、

exp(有効期限):トークンが期限切れになるUNIXエポックからの秒数。 iatより最大で3600秒遅れることがあります。 (注:これはカスタムトークン自体の有効期限のみを制御します。ただし、signInWithCustomToken()を使用してユーザーにサインインすると、セッションが無効になるか、ユーザーがログアウトするまで、ユーザーはデバイスにサインインしたままになります。)

document が言うように、カスタムJWTトークンは最大1時間有効です。そのため、有効期限が切れる前に、Firebaseでユーザーを認証してください。その後、セッションはアクティブのままになります。有効期限はありません!

以下の方法を使用して、ユーザーが有効なセッションを持っていることを確認できます。

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

これがあなたに役立つことを願っています!

13
Karthi R

正しくセットアップされていれば、SDKがトークンを最新の状態に保ちます。 詳細 カスタムトークンは、セッションの開始にのみ使用されます。したがって、カスタムトークンを使用してサインインするには1時間かかる必要があります。サインインしてFirebase管理者アカウントとアプリの構成が正しく設定されると、SDKはFirebaseバックエンドと相互に通信して、トークンを最新の状態に保つことができます。 FirebaseAuth.signout()でログアウトした後、1時間以上経過した場合は、再度サインインするための新しいカスタムトークンが必要になります。

2
Jeremy House

このようなものは、トークンをチェックして、期限切れかどうかを確認する方法です。その後、新しいものを造ることができます

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;
}
0
stepheaw