使用 Firebase Auth 访问 Google Calendar API

Posted

技术标签:

【中文标题】使用 Firebase Auth 访问 Google Calendar API【英文标题】:Using Firebase Auth to access the Google Calendar API 【发布时间】:2017-02-16 07:33:13 【问题描述】:

我正在使用 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 访问令牌,如果没有,还有什么其他解决方案可以解决这个问题对用户进行两次身份验证?

更新 1:

好像someone else has struggled with similar problems with Facebook authentication。关于那个问题,有一个 link to the Firebase documentation 声明 Firebase 身份验证不再保留访问令牌。那么如何处理令牌刷新?真的没有答案吗?

更新 2:

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

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

我明白了你的意思,这确实是一个很好的建议。我们清楚地知道,许多用户,例如您自己,都希望在刷新时访问令牌的 OAuth 功能。我们正在探索潜在的解决方案,但我不能保证这是否会很快推出。不过,我们会继续考虑您的反馈意见。持续改进对我们的社区非常重要,因此感谢您提出这个问题!

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

因此,目前似乎无法通过 Firebase SDK 获得访问令牌。我仍在努力寻找解决方法,所以如果有人对有效的解决方案有想法,我会很高兴听到他们的声音。当然,如果我自己找到可行的解决方案,我会在这里发布。

【问题讨论】:

我认为应该将细节添加到 currentUser 对象中,您是否尝试过检查当前用户对象中存在的内容? firebase.auth().currentUser;firebase.google.com/docs/auth/web/manage-users 是的,但我似乎无法从那里找到 Google 令牌。我也尝试过 getToken() 函数,但 Firebase JWT 令牌不能与 Google API 一起使用。 另见***.com/questions/49182671/… 【参考方案1】:

我终于通过在 Firebase 外部使用 Google APIs javascript 客户端处理身份验证解决了这个问题。此解决方案需要将 Google 身份验证客户端包含为 documented here。手动处理 Firebase 登录流程记录在 here。

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 进行身份验证。

【讨论】:

天哪!我现在只想亲你!感谢这个实时保存的答案!

以上是关于使用 Firebase Auth 访问 Google Calendar API的主要内容,如果未能解决你的问题,请参考以下文章

使用 Firebase Auth 访问 Google Calendar API

使用共享用户访问组时,Firebase Auth 用户已过时

如何使用firebase auth限制对next.js中页面的访问?

使用 auth.uid 限制对 Firebase-Database 的访问不起作用

firebase auth是否可以存储和管理不同提供商的访问令牌?

Firebase 存储安全规则:指定“允许读取:如果 request.auth != null”后,我仍然可以使用提供的下载链接访问我的文件