Как обновить Google AccessToken в Firebase? #AskFirebase

Я пытаюсь создать веб-приложение, которое будет интегрировано и установлено на Google Диске. Пользователь сможет создавать и обмениваться файлами моего приложения на своем диске. Я пытаюсь написать его, используя Firebase, чтобы использовать многие из замечательных новых функций. Однако у меня возникают проблемы с согласованной работой аутентификации на этих двух платформах.

Это клиентское приложение (по крайней мере, на данный момент), поэтому я не могу использовать автономную аутентификацию и обновлять токены.

Перед аутентификацией в Firebase я бы использовал Google Identity Toolkit с 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.auth2.getAuthInstance().currentUser.get().getAuthResponse(true));

Как обычно, токен доступа длится около часа, а затем истекает. Важно то, что мы можем просто вызвать GoogleUser.reloadAuthResponse(), чтобы получить обновленный токен доступа. Обратите внимание, что это обновленный токен доступа, а не токен обновления!

Итак, теоретически, я могу просто использовать этот токен доступа для аутентификации с помощью Firebase, как описано здесь, и мне просто нужно жить с потоком всплывающих окон или попытаться взломать его.

Все это говорит о том, что Google говорит, что Identity Toolkit заменяется аутентификацией Firebase, и что новые приложения должны использовать Firebase.

Новейшая версия Google Identity Toolkit была выпущена как Аутентификация Firebase. Он включает в себя обновленные клиентские SDK, библиотеки UI с открытым исходным кодом, управление сеансами и интегрированную службу отправки электронной почты для потоков забытых паролей.

Новые проекты должны использовать Firebase Authentication. Чтобы перенести существующий проект из Identity Toolkit в Firebase Authentication, см. Руководство по миграции.

Цитируется из: 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, но мне нужно будет заставить пользователя снова войти в систему, чтобы получить доступ к диску. Это не будет делать!

Я ищу эквивалент GoogleUser.reloadAuthResponse() в Firebase.

  • Как я могу это сделать?
  • Каков рекомендуемый способ создания веб-приложения, которое обращается как к службам Firebase, так и к G Suite?
  • Есть ли официальные примеры?

2 ответа

Решение

Вы уже используете gapi для получения токена доступа и обновления его каждый час для интеграции с Google Drive API. Придерживайтесь этого. Что вам нужно сделать, это использовать следующий API для входа в Firebase с учетными данными Google:

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

Теперь вы войдете в Firebase, а ваш токен доступа будет обновляться через gapi. Сессии Firebase являются неопределенными, поэтому вам не нужно снова входить в Firebase.

Для тех, кто просто пытается получить токен для аутентифицированных вызовов конечных точек после использования входа в Google через firebase (т. Е. Для конечных точек облака 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 является JWT и отличается от токена в учетных данных от обратного вызова входа в систему. Функция getIdToken() обновит токен, если он понадобится, и вернет действительный токен обратному вызову. Ток в учетных данных из обратного вызова для входа в систему истекает через 1 час, как сказал OP, и не может быть обновлен без повторной попытки входа.

Если вы хотите выполнять аутентифицированные вызовы конечных точек с помощью Firebase Google Signin, используйте getIdToken(). Затем следуйте инструкциям для конечных точек облака Google с помощью firebase auth.