Solución:
Cuando haces una llamada desde un navegador .getIdToken(true)
actualizará automáticamente su token. Haz una llamada como esta:
firebase.auth().currentUser.getIdToken(/ forceRefresh / true)
.then(function(idToken) {
}).catch(function(error) {
});
Más información aquí https://firebase.google.com/docs/reference/js/firebase.User#getIdToken
** ACTUALIZAR ** esto ahora también está documentado en los documentos REST de Firebase en Exchange a refresh token for an ID token
sección:
https://firebase.google.com/docs/reference/rest/auth/#section-refresh-token
Actualmente, la única forma que encontré para hacer esto es aquí: https://developers.google.com/identity/toolkit/reference/securetoken/rest/v1/token
Debe realizar una solicitud HTTP:
POST
https://securetoken.googleapis.com/v1/token?key=YOUR_KEY
Dónde YOUR_KEY
se puede encontrar en la consola de desarrolladores de Google> Administrador de API> Credenciales. Esta debajo del API Keys
sección.
Asegúrese de que el cuerpo de la solicitud esté estructurado en el siguiente formato:
grant_type=refresh_token&refresh_token=REFRESH_TOKEN
Dónde REFRESH_TOKEN
es el token de actualización del objeto de usuario de Firebase cuando inició sesión.
Debes configurar el encabezado Content-Type: application/x-www-form-urlencoded
o obtendrá errores (por ejemplo, “MISSING_GRANT_TYPE”).
los POST
la llamada devolverá una nueva idToken
(solía ser llamado access_token
)
Supongo que la mayoría de la gente aquí está buscando una forma de mantener su autenticación no en un navegador, sino, por ejemplo, en un backend de nodo. Resulta que en realidad hay una forma de hacer esto:
- Cambie el token de actualización por un token de acceso (usando la API pública de Google)
- Cambie el token de acceso por un token personalizado (usando una función de base de fuego, ver más abajo)
- Iniciar sesión con token personalizado
Aquí está la esencia del código:
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': 'text/plain'},
url: 'https://<yourFirebaseApp>.cloudfunctions.net/createCustomToken',
body: {token: res.access_token},
json: true
});
await firebaseApp.auth().signInWithCustomToken(customToken);
Y la función de base de fuego:
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);
}
});