如何在 Firebase 中刷新 Google AccessToken? #AskFirebase

How to Refresh Google AccessToken in Firebase? #AskFirebase

我正在尝试构建一个将与 Google 云端硬盘集成并安装到其中的网络应用程序。用户将能够在他们的驱动器中创建和共享我的应用程序的文件。我正在尝试使用 Firebase 编写它,这样我就可以利用那里的许多很棒的新功能。但是,我无法让授权在这两个平台上始终如一地工作。

这是一个仅限客户端的应用程序(至少目前是这样),所以我无法使用离线身份验证和刷新令牌。

在 Firebase 身份验证之前,我会使用 Google Identity Toolkit with gapi。这通常工作正常,尽管它使用的弹出流程不适合移动设备。

    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 有点笨拙,但它确实有效。 access token可以通过调用

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

像往常一样,访问令牌只持续大约一个小时,然后就过期了。 重要 的事情是我们可以调用 GoogleUser.reloadAuthResponse() 来获得刷新的访问令牌。注意,那是刷新的访问令牌,不是刷新令牌!

因此,理论上,我可以使用该访问令牌作为 , and have to just live with the popup flow, or .

通过 Firebase 进行身份验证

综上所述,Google 表示身份工具包正在被 Firebase 身份验证取代,新应用程序应使用 Firebase。

The newest version of Google Identity Toolkit has been released as Firebase Authentication. It includes upgraded client SDKs, open source UI libraries, session management and integrated email sending service for forgotten password flows.

New projects should use Firebase Authentication. To migrate an existing project from Identity Toolkit to Firebase Authentication, see the migration guide.

Quoted from: Google

Firebase 有一个简单的 API 用于 Google 的身份验证。我可以在身份验证后获取并存储 AccessToken。所以这似乎是我应该实施身份验证的方式,新的和改进的 Firebase 方式。此外,Firebase 还提供了适用于移动设备的出色重定向流程。

但是,有个大问题...

这将获得访问令牌。

    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;
   })

访问令牌可用,我可以用它 read/write 到驱动器,...一个小时 。一旦该令牌过期,我将无法再做任何事情。用户仍登录到 Firebase,因此我可以继续使用 Firebase 服务,但我需要强制用户再次登录才能访问驱动器。这不行!

我正在寻找 Firebase 中 GoogleUser.reloadAuthResponse() 的等价物。

您已经在使用 gapi 获取访问令牌并每小时刷新一次,以便与 google 驱动器 API 集成。坚持下去。您需要做的是使用以下 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. ... });

您现在将登录到 Firebase,同时您的访问令牌将继续通过 gapi 刷新。 Firebase 会话是无限期的,因此您无需再次登录 Firebase。

对于任何在使用 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() 函数将在需要时刷新令牌,并且 return 回调的有效令牌。正如 OP 所说,来自登录重定向回调的凭据中的令牌将在 1 小时后过期,如果不尝试再次登录就无法刷新。

如果您想使用 firebase google 登录进行经过身份验证的端点调用,请使用 getIdToken()。然后使用 firebase auth

按照 google 云端点的说明进行操作