Saltar al contenido

¿Cómo usar Firebase refreshToken para volver a autenticarse?

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:

  1. Cambie el token de actualización por un token de acceso (usando la API pública de Google)
  2. Cambie el token de acceso por un token personalizado (usando una función de base de fuego, ver más abajo)
  3. 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);
    }
});
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *