web-dev-qa-db-ja.com

FirebaseでGoogleAccessTokenを更新する方法は? #AskFirebase

Googleドライブと統合してインストールするウェブアプリを作成しようとしています。ユーザーは、自分のドライブでアプリのファイルを作成して共有できるようになります。 Firebaseを使用して作成しようとしているので、Firebaseの優れた新機能の多くを活用できます。ただし、これら2つのプラットフォーム間で認証を一貫して機能させるのに問題があります。

これは(少なくとも今のところ)クライアント側のみのアプリであるため、オフラインの認証トークンと更新トークンを使用することはできません。

Firebase認証の前に、 gapiを使用したGoogle Identity Toolkit を使用します。これは通常は正常に機能しますが、モバイルフレンドリーではないポップアップフローを使用します。

    gapi.signin2.render(elementId, {
        longtitle: true,
        width: 230,
        height: 50,
        theme: "dark"
    });

    var auth2 = gapi.auth2.init({
        client_id: CLIENT_ID,
        scope: SCOPES.join(" ")
    });

    auth2.isSignedIn.listen(signinChanged);
    auth2.currentUser.listen(userChanged);

Gapiは少し不器用ですが、機能します。 アクセストークンは、

    gapi.auth2.getAuthInstance().currentUser.get().getAuthResponse(true));

いつものように、アクセストークンは約1時間しか持続せず、その後期限切れになります。 importantは、GoogleUser.reloadAuthResponse()を呼び出すことができるということです。更新されたアクセストークンを取得します。これは更新されたアクセストークンであり、更新トークンではないことに注意してください。

したがって、理論的には、そのアクセストークンを使用してFirebaseで認証することができます ここで説明 、ポップアップフローをそのまま使用するか、 ハックしてみてください

とはいえ、Googleによると、Identity ToolkitはFirebase認証に置き換えられており、新しいアプリではFirebaseを使用する必要があります。

Google IdentityToolkitの最新バージョンがFirebaseAuthenticationとしてリリースされました。これには、アップグレードされたクライアントSDK、オープンソースUIライブラリ、セッション管理、およびパスワードを忘れた場合の統合された電子メール送信サービスが含まれます。

新しいプロジェクトでは、Firebase認証を使用する必要があります。既存のプロジェクトをIdentityToolkitからFirebaseAuthenticationに移行するには、移行ガイドをご覧ください。

引用元:Google

Firebaseには、Googleでの認証用の簡単なAPIがあります。認証時にAccessTokenを取得して保存できます。つまり、これがauthを実装する方法であり、新しく改良されたFirebaseの方法のようです。また、Firebaseは、モバイルデバイスで機能するNiceリダイレクトフローを提供します。

しかし、大きな問題があります...

これにより、アクセストークンが取得されます。

    firebase.auth().getRedirectResult().then(function(result) {
      if (result.credential) {
        // This gives you a Google Access Token. You can use it to access the Google API.
        var token = result.credential.accessToken;
        // ...
      }

      // The signed-in user info.
      var user = result.user;
   })

アクセストークンが利用可能であり、それを使用してドライブの読み取り/書き込みを行うことができます... 1時間。そのトークンの有効期限が切れると、私は何もできなくなります。ユーザーは引き続きFirebaseにログインしているため、引き続きFirebaseサービスを使用できますが、ドライブにアクセスするには、ユーザーに再度ログインするように強制する必要があります。これではうまくいきません!

FirebaseでGoogleUser.reloadAuthResponse()に相当するものを探しています。

  • これどうやってするの?
  • FirebaseサービスとGSuiteの両方にアクセスするWebアプリを構築するための推奨される方法は何ですか?
  • 公式の例はありますか?
14
Gary

すでにgapiを使用してアクセストークンを取得し、GoogleドライブAPIとの統合のために1時間ごとに更新しています。それに固執します。次のAPIを使用して、Google認証情報を使用してFirebaseに署名する必要があります。

var cred = firebase.auth.GoogleAuthProvider.credential(null, gapiAccessToken); firebase.auth().signInWithCredential(cred).then(function(user) { // You are signed in to Firebase now and do not need to re-sign in again. ... });

これで、アクセストークンがgapiを介して更新され続けている間、Firebaseにサインインします。 Firebaseセッションは無期限であるため、Firebaseに再度サインインする必要はありません。

7
bojeil

Firebase googleサインイン(つまり、googleクラウドエンドポイント)を使用した後、認証されたエンドポイント呼び出しのトークンを取得しようとしている人は、次を使用できます。

var successCallback = function(firebaseIdJsonWebToken) {
   console.log("token: " + firebaseIdJsonWebToken);
}
var errorCallback = function(error) {
   console.log("error: " + error);
}
firebase.auth().currentUser.getIdToken().then(successCallback, errorCallback)

Firebase IDトークンはJWTであり、サインインリダイレクトコールバックの認証情報のトークンとは異なります。 getIdToken()関数は、必要に応じてトークンを更新し、有効なトークンをコールバックに返します。サインインリダイレクトコールバックからの資格情報のトークンは、OPが言ったように、1時間で期限切れになり、再度サインインを試行しないと更新できません。

Firebase googleサインインを使用して認証済みエンドポイント呼び出しを行う場合は、getIdToken()を使用します。次に、firebaseauthを使用してGoogleCloudエンドポイントの手順に従います

0
caitoo0o