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

时间:2016-12-29 21:37:07

标签: firebase google-drive-api firebase-authentication google-authentication google-identity-toolkit

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

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

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

获取访问令牌
    gapi.auth2.getAuthInstance().currentUser.get().getAuthResponse(true));

与往常一样,访问令牌只持续约一个小时然后到期。 重要的是我们可以调用 GoogleUser.reloadAuthResponse()来获取刷新的访问令牌。注意,这是刷新的访问令牌,而不是刷新令牌!

因此,从理论上讲,我可以使用该访问令牌作为described here对Firebase进行身份验证,并且必须使用弹出流,或try to hack around that

所有这一切,谷歌表示Identity Toolkit正在被Firebase身份验证所取代,新应用程序应该使用Firebase。

  

最新版Google Identity Toolkit已发布为   Firebase身份验证。它包括升级的客户端SDK,开源   UI库,会话管理和集成电子邮件发送服务   忘记了密码流。

     

新项目应使用Firebase身份验证。迁移   从Identity Toolkit到Firebase身份验证的现有项目,请参阅   迁移指南。

Quoted from: Google

Firebase有一个简单的API用于与Google进行身份验证。我可以在验证时获取并存储AccessToken。所以这似乎是我应该实现auth的方式,新的和改进的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;
   })

访问令牌可用,我可以使用它来读取/写入驱动器, ...一小时。一旦该令牌到期,我就再也无法做任何事了。用户仍然登录到Firebase,因此我可以继续使用Firebase服务,但我需要强制用户再次登录才能访问该驱动器。这不会做!

我在Firebase中寻找相当于 GoogleUser.reloadAuthResponse()的内容。

  • 我该怎么做?
  • 建立访问Firebase服务和G Suite的网络应用的推荐方法是什么?
  • 有官方的例子吗?

2 个答案:

答案 0 :(得分:5)

您已经在使用gapi获取访问令牌并每小时刷新一次,以便与Google Drive 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. ... });

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

答案 1 :(得分:-1)

对于在使用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,与signin重定向回调的凭据中的令牌不同。如果需要,getIdToken()函数将刷新令牌并将有效令牌返回给回调。来自登录重定向回调的凭证中的令牌将在1小时内到期,如OP所述,并且无法在不尝试再次登录的情况下刷新。

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

的说明操作google云端点