Как использовать Firebase refreshToken для повторной проверки подлинности?
Я использую вызов библиотеки JS firebase.auth().signInWithEmailAndPassword(email, password)
и возвращаю объект User
. Объект User
содержит refreshToken
.
Я использую curl 'https://docs-examples.firebaseio.com/rest/saving-data/auth-example.json?auth=TOKEN'
для вызова Firebase.
Истекший токен истекает. Чтобы это выглядело, как приложение (iOS
и macOS
) имеет постоянный вход в систему, я хочу обновить токен, как это сделать, используя библиотеку REST
или JS
? Я не могу найти вызовы в документации, которые позволяют мне использовать refreshToken
, чтобы получить новый token
.
Ответы
Ответ 1
В настоящее время я нашел единственный способ сделать это: https://developers.google.com/identity/toolkit/reference/securetoken/rest/v1/token.
Вы должны сделать HTTP-запрос:
POST
https://securetoken.googleapis.com/v1/token?key=YOUR_KEY
Где YOUR_KEY
можно найти в консоли разработчиков Google> API Manager> Учетные данные. Это в разделе " API Keys
".
Убедитесь, что тело запроса структурировано в следующем формате:
grant_type=refresh_token&refresh_token=REFRESH_TOKEN
Где REFRESH_TOKEN
- токен обновления от пользовательского объекта Firebase, когда они REFRESH_TOKEN
в систему.
Вы должны установить заголовок Content-Type: application/x-www-form-urlencoded
иначе вы получите ошибки (например, "MISSING_GRANT_TYPE").
Вызов POST
вернет новый access_token
.
** ОБНОВЛЕНИЕ ** теперь это также задокументировано в документации Firebase REST под Exchange a refresh token for an ID token
раздела Exchange a refresh token for an ID token
:
https://firebase.google.com/docs/reference/rest/auth/
Ответ 2
Когда вы звоните из браузера, .getIdToken(true)
автоматически .getIdToken(true)
ваш токен. Сделайте звонок так:
firebase.auth().currentUser.getIdToken(/ forceRefresh / true)
.then(function(idToken) {
}).catch(function(error) {
});
Более подробная информация здесь https://firebase.google.com/docs/reference/js/firebase.User#getIdToken
Ответ 3
// Create a callback which logs the current auth state
function authDataCallback(authData) {
if (authData) {
console.log("User " + authData['uid'] + " is logged with token" + authData['ie']);
} else {
console.log("User is logged out");
}
}
// Register the callback to be fired every time auth state changes
var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");
ref.onAuth(authDataCallback);
Событие onAuth
будет вызываться при обновлении страницы, если пользователь вышел из системы authData
будет null, иначе нет. Вы можете найти токен в authdata['ie']
. На скриншоте ниже я напечатал токен после объекта auth и authdata, как вы можете видеть, что authData ['ie'] и токен похожи.
![authdata.ie и токен]()
Ответ 4
Я предполагаю, что большинство людей здесь ищут способ сохранить свою аутентификацию не в браузере, а, например, в бэкэнде узла. Оказывается, на самом деле есть способ сделать это:
- Обменяйте токен обновления на токен доступа (используя общедоступный API Google)
- Обменяйте токен доступа на собственный токен (используя функцию firebase, см. Ниже)
- Войти с помощью токена
Вот суть кода:
const requestP = require('request-promise');
const fsP = require('fs').promises;
const refreshToken = await fsP.readFile('./refresh_token.txt');
const res = await requestP.post({
headers: {'content-type': 'application/x-www-form-urlencoded'},
url: 'https://securetoken.googleapis.com/v1/token?key=' + firebaseConf.apiKey,
body: 'grant_type=refresh_token&refresh_token=' + refreshToken,
json: true
});
const customToken = await requestP.post({
headers: {'content-type': 'application/json'},
url: 'https://<yourFirebaseApp>.cloudfunctions.net/createCustomToken',
body: {token: res.access_token},
json: true
});
await firebaseApp.auth().signInWithCustomToken(customToken);
И функция firebase:
export const createCustomToken = functions.https.onRequest(async (request, response) => {
response.set('Access-Control-Allow-Origin', '*');
try {
const token = JSON.parse(request.body).token;
const decodedToken = await admin.auth().verifyIdToken(token);
const customToken = await admin.auth().createCustomToken(decodedToken.uid);
response.send(customToken);
} catch(e) {
console.log(e);
response.sendStatus(500);
}
});