8

我正在尝试构建一个将与Google Drive集成并安装到其中的网络应用程序。用户将能够在其驱动器中创建和共享我的应用程序的文件。我正在尝试使用Firebase编写它,这样我就可以利用那里的许多优秀新功能。但是,我无法使auth在这两个平台上一致地工作。如何在Firebase中刷新Google AccessToken? #AskFirebase

这是客户端唯一的应用程序(至少现在),所以我不能使用脱机身份验证和刷新令牌。

在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()获取刷新的访问令牌。请注意,这是刷新的访问令牌,不是刷新令牌!

因此,从理论上讲,我可以使用该访问令牌与Firebase进行身份验证,如described here,并且只能使用弹出流量或try to hack around that。谷歌表示,Identity Toolkit正在被Firebase身份验证取代,新应用应该使用Firebase。

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

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

Quoted from: Google

火力地堡拥有与谷歌身份验证一个简单的API。验证后,我可以获取并存储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的Web应用程序的推荐方式是什么?
  • 有没有官方的例子?
+0

您可能需要查看此[论坛](https://groups.google.com/forum/#!msg/firebase-talk/wAcJFfQlFeg/IUuJXNcgDHgJ),它是一个有点旧,但它讨论了如何获取刷新令牌的一些步骤。还有一个相关的[论坛](https://groups.google.com/forum/#!topic/firebase-talk/ZPW3xtwn8g0)讲述了您遇到的问题。我不确定是否有任何更新,但我认为您可以在上述论坛中应用该解决方法。希望这可以帮助。 –

+0

感谢您的回复和链接。这些有点过时了,特别是我认为在Google收购Firebase之前的第一个。我没有看到一个可行的解决方法,除了一个模糊的评论,不使用他们的谷歌身份验证,并自己从头开始在服务器上使用刷新令牌来实现它。 :( 我不明白为什么谷歌会公开推荐使用Firebase的Google Auth,而不是Identity Toolkit,如果它不支持在一个小时之内对Google API进行扩展身份验证,我希望Google的某些人会回复并提供一些明确的指导 – Gary

回答

4

您已经在使用gapi获取访问令牌并每小时刷新一次,以便与Google Drive API进行整合。坚持。你需要做的是使用下面的API登录到火力地堡与谷歌凭据:

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。

+0

谢谢,我其实还没有做,这是一个新的应用程序,我试图以今天正确的方式做到这一点,我将谷歌的消息解读为:“使用Firebase身份验证,而不是旧的Identity Toolkit “所以这就是我想要做的,另外,我的应用程序需要一个_redirect flow_,而Identity Toolkit似乎没有官方的方法来做到这一点,Firebase Auth将是完美的,只要我能弄清楚如何刷新访问令牌_。 – Gary

+0

不幸的是,gapi不支持重定向流,Firebase不刷新访问令牌。正如我所解释的,您需要使用两个API(gapi刷新访问令牌和F irebase Auth signInWithCredential)。请通过https://groups.google.com/forum/#!forum/firebase-talk提交功能请求,以支持通过Firebase刷新OAuth令牌。 – bojeil

+0

您是否知道功能请求是否已提交,以便我可以跟踪它?我搜索了,但找不到一个。谢谢! –

0

对于任何人只是想获得身份验证的端点的令牌进行调用使用火力谷歌标志(即Google云端点)后,您可以使用:

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

的火力ID令牌是智威汤逊,是不同于来自登录重定向回调的凭证中的令牌。如果需要,getIdToken()函数将刷新令牌并将有效令牌返回给回调。来自登录重定向回调的凭证中的令牌将在OP所说的1小时内过期,如果不尝试再次登录,则无法刷新该令牌。

如果您想使用firebase google登录进行身份验证的端点调用,请使用getIdToken()。然后按照使用Firebase身份验证的Google云端点说明进行操作

相关问题