当前位置: 首页 > 面试题库 >

使用Firebase Auth访问Google Calendar API

竺翰海
2023-03-14
问题内容

我正在使用AngularJS,Firebase(SDK v3)和Google Calendar API构建Web应用程序。我正在使用Google
OAuth对用户进行身份验证。我的目的是能够从Firebase中的数据库节点创建日历事件。到目前为止,我设法通过以下方法请求访问日历范围:

_authProvider = new firebase.auth.GoogleAuthProvider();
// Get permission to manage Calendar
_authProvider.addScope("https://www.googleapis.com/auth/calendar");
_fbAuthObject.signInWithRedirect(_authProvider);

我正在使用重定向流进行身份验证,因此身份验证重定向可用于:

_fbAuthObject.getRedirectResult()
    .then(function _readToken(result) {
      if (result.credential) {
        _googleToken = result.credential.accessToken;
        var authHeader = 'Bearer '+ _googleToken;

        // Just a test call to the api, returns 200 OK 
        $http({
          method: 'GET',
          headers: {
            'Authorization': authHeader
          },
          url: 'https://www.googleapis.com/calendar/v3/users/me/calendarList/primary'
        })
          .then(function success(response) {
            console.log('Cal response', response);
          },
          function error(response) {
            console.log('Error', response);
          });

但是,似乎在首次登录后,无法通过Firebase SDK获取Google访问令牌。似乎只能访问Firebase JWT令牌,而不能与Calendar
API一起使用。我可以存储访问令牌,但这在刷新令牌等时无法解决问题。有什么方法可以使用Firebase SDK获取当前的Google
Access令牌,如果没有,可以使用什么其他解决方案来解决该问题两次验证用户身份?

更新1:

似乎其他人正在为Facebook身份验证遇到类似问题。在该问题上,有一个指向Firebase文档的链接,指出Firebase身份验证不再保留访问令牌。那么我该如何处理令牌刷新呢?真的没有答案吗?

更新2:

因此,我联系Firebase支持并提供了有关此问题的功能请求,他们给了我以下答案:

感谢您抽出宝贵时间给我们写信。

我的意思是,这确实是一个好建议。我们肯定知道许多用户(例如您自己)希望使用OAuth功能,该功能将在刷新后访问令牌。我们正在探索潜在的解决方案,但我不能保证它是否会很快出现。我们会继续考虑您的反馈意见。持续改进对我们的社区非常重要,因此感谢您提出!

请留意我们的发行说明以获取任何进一步的更新。

因此,目前看来访问令牌无法通过FirebaseSDK获得。我仍在尝试寻找解决方法,因此,如果有人对有效的解决方案有任何想法,我将很高兴听到它们。当然,如果我自己找到可行的解决方案,我会在此处发布。


问题答案:

通过使用Google APIJavaScript客户端在Firebase外部处理身份验证,终于解决了这个问题。此解决方案需要包括此处记录的Google auth客户端。此处记录了手动处理Firebase登录流程。

gapi.auth2.getAuthInstance().signIn()
    .then(function _firebaseSignIn(googleUser) {
      var unsubscribe = firebase.auth().onAuthStateChanged(function(firebaseUser) {
        unsubscribe();
        // Check if we are already signed-in Firebase with the correct user.
        if (!_isUserEqual(googleUser, firebaseUser)) {
          // Build Firebase credential with the Google ID token.
          var credential = firebase.auth.GoogleAuthProvider.credential(
            googleUser.getAuthResponse().id_token);

          // Sign in with credential from the Google user.
          return firebase.auth().signInWithCredential(credential)
            .then(function(result) {
              // other stuff...
            });

_isUserEqual函数:

function _isUserEqual(googleUser, firebaseUser) {
  if (firebaseUser) {
    var providerData = firebaseUser.providerData;
    for (var i = 0; i < providerData.length; i++) {
      if (providerData[i].providerId === firebase.auth.GoogleAuthProvider.PROVIDER_ID &&
        providerData[i].uid === googleUser.getBasicProfile().getId()) {
        // We don't need to reauth the Firebase connection.
        return true;
      }
    }
  }
  return false;
}

现在,我可以像这样引用访问令牌:

var user = gapi.auth2.getAuthInstance().currentUser.get();
return user.getAuthResponse().access_token;

对于我来说,这仍然不是理想的解决方案,但它现在可以使用,并且我能够通过Firebase和Calendar API进行身份验证。



 类似资料:
  • 问题内容: 我正在寻找一种在Java App(使用JDBC)中打开Access MDB文件的方法。 快速的Google搜索建议我为此需要JDBC-ODBC Bridge。 这是否意味着我需要配置要在其上运行应用程序的每个系统,以便为要打开的MDB提供ODBC DSN? 还有一个问题(因为我以前从未使用过ODBC):通信是通过某种套接字(以客户机/服务器方式)还是通过方法/函数调用(例如嵌入Derb

  • 问题内容: 我正在使用Access,并尝试复制在MSDN上发现的某些语法。不幸的是,Access语法中的FROM语句似乎有问题。我不知道为什么。 问题答案: MS Access中枢转的语法与sql server不同。您必须使用该功能来旋转数据。 语法将类似于以下内容:

  • 问题内容: 我正在尝试使用访存api来带回一些数据,但是一旦检索到它就无法将其映射到控制台。 我得到的错误是 response.map不是函数 所以我试图解析响应(即var data = JSON.parse),该响应不起作用,并显示错误 有趣的是,当对XMLHttp请求执行相同操作时,需要解析它,因此我也想知道为什么这两种检索数据方法之间的区别。 如果有人能指出正确的方向,我将不胜感激。 问题答

  • 我正在尝试使用onelogin php toolkit for SAML访问不同域上的ADFS IDP。ADFS只显示一个包含以下内容的屏幕 错误详细信息 活动ID:00000000-0000-0000-f980-0080000400cd 错误时间:星期四,24 Aug2017 13:48:15GMT Cookie:启用 用户代理字符串:Mozilla/5.0(Windows NT 10.0; W

  • 硒的新手,这是我的示例项目。 我无法访问div中的一个元素,我尝试过搜索答案,但只找到了java代码。由于我是硒新手,我正在使用表格的方式进行测试。 我找到了这个答案: 您可以使用cssSelector, driver.switchTo().frame(driver.findElement(通过.cssSelector(“iframe[title='Fill Quote'))); 但没有名为dri

  • 我在干什么? 步骤1-启用邻近API: 为了使用接近API,它必须首先在谷歌开发控制台中启用。使用本教程,我为我的项目启用了对邻近API的支持 步骤2-获取凭据: 根据本教程,我需要得到客户端ID和秘密。这就是我困惑的地方。凭据->添加凭据->OAuth2.0客户端ID->选择Chrome App单选按钮(因为我使用的是Postman)->输入Postman的Chrome Web store UR

  • 问题内容: 我有一个必须执行重复任务的Web应用程序,发送消息和警报,我已经使用脚本页面在浏览器中加载它们时执行了这些任务,即http://example.com/tasks.php,我已经在我的Web应用程序的每个页面中都使用iframe表示。 现在,我想将其更改为使用CRON作业,因为第一种方法可能会导致卡纸性能,因此,我如何制作访问http://example.com/tasks.php的C

  • 问题内容: 是否可以使用Selenium / Chrome Webdriver访问Shadow DOM中的元素? 正如预期的那样,使用普通元素搜索方法不起作用。我已经在w3c上看到了对switchToSubTree规范的引用,但找不到任何实际的文档,示例等。 有人成功吗? 问题答案: 不幸的是,webdriver规范似乎还不支持此功能。 我的侦探被发现: http://www.w3.org/TR/