Как обновить 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, см. Руководство по миграции.
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.