6

Я создаю веб-приложение, используя AngularJS, Firebase (SDK v3) и API календаря Google. Я проверяю пользователей с помощью Google OAuth. Моя цель - создать события календаря из узлов базы данных в Firebase. До сих пор мне удалось запросить доступ к календарной рамке с:Использование Firebase Auth для доступа к API календаря Google

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

Однако, похоже, вне первоначального входа в систему невозможно получить токен доступа Google через Firebase SDK. Кажется, возможно только получить доступ к токенам Firebase JWT, без использования с API календаря. Я мог бы хранить токен доступа, но это не решило бы проблемы при обновлении токена и т. Д. Есть ли способ получить текущий токен Google Access с Firebase SDK, а если нет, то какие другие решения могут быть решены без для проверки подлинности пользователя дважды?

UPDATE 1:

Похоже someone else has struggled with similar problems with Facebook authentication. В этом вопросе был link to the Firebase documentation, в котором говорится, что аутентификация Firebase больше не сохраняет токен доступа. Итак, как я могу справиться с токеном? На самом деле нет ответа?

UPDATE 2:

Итак, я связался Firebase поддержки с просьбой полнометражного об этой проблеме, и они дали мне следующий ответ:

Спасибо, что нашли время написать нам.

У меня есть ваша точка здесь, это действительно хорошее предложение. Мы определенно знаем, что многие пользователи, такие как вы, хотели бы, чтобы функция OAuth имела доступ к токену при обновлении. Мы изучаем потенциальные решения, но я не могу гарантировать, что это будет доступно в ближайшее время. Тем не менее, мы будем учитывать ваши отзывы. Непрерывное улучшение очень важно для нашего сообщества, поэтому благодарим за это!

Обратите внимание на наши примечания к выпуску для любых дальнейших обновлений.

Так что на данный момент токены доступа недоступны через SDK Firebase. Я все еще пытаюсь найти обходное решение, поэтому, если у кого-то есть идеи относительно правильного решения, я был бы рад услышать их. И, конечно, я отправлю его сюда, если найду рабочее решение самостоятельно.

+1

Я полагаю, что детали необходимо добавить к объекту currentUser, попытались ли вы проверить, что существует в текущем объекте пользователя? 'firebase.auth(). currentUser;' https://firebase.google.com/docs/auth/web/manage-users –

+0

Да, но я, похоже, не могу найти токены Google. Я также попробовал функцию getToken(), но токен Firebase JWT не может использоваться с API Google. – RoniPa

+0

См. Также https://stackoverflow.com/questions/49182671/is-it-possible-to-add-events-to-a-users-google-calendar-via-firebase-server-sid/49183647#49183647 – Kato

ответ

4

Я, наконец, обошел эту проблему, обратившись к аутентификации вне Firebase с помощью клиента JavaScript API Google API. Это решение требует, в том числе клиента auth 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; 
} 

Теперь я могу ссылаться на маркер доступа, как это:

Это до сих пор не является идеальным решением для меня, но это работает теперь, и я могу пройти аутентификацию как Firebase, так и API календаря.

Смежные вопросы