Cómo realizar una simple prueba de integración usando Firebase Auth
Cómo realizar una simple prueba de integración usando Firebase Auth — RO Solutions Blog
Al querer hacer pruebas de integración a una API que necesita token de usuario de firebase para realizar la autenticación, surge un problema: Se necesita sacar manualmente el token para enviarlo en todas las variables. Aquí veremos cómo automatizar una simple prueba de integración usando Mocha, Chai y Supertest a un servidor basado en Express.
Pre-requisitos:
Un proyecto ya creado en Firebase.
Node 8.0+
Inicialización de proyecto y paquetes
Dentro de la carpeta del proyecto, iniciamos la consola y ponemos el siguiente comando: > npm init Rellenamos los datos y posteriormente vamos a ejecutar dos comandos separados, los cuales son: > npm install firebase --save-dev > npm install firebase-admin Si te preguntas lo siguiente: ¿Por qué no puedo instalar primero firebase-admin que firebase o en una sola línea de código? Instalando “firebase-admin” primero, genera problemas al obtener el SDK de autenticación, por eso es separado para evitar este pequeño error.
Obtener el código de inicialización de Firebase
Para la inicialización del cliente al estar en la página principal del proyecto, seleccionamos la opción de “Añade Firebase a tu aplicación Web”, el cual nos dará un fragmento de código el cual solo necesitaremos la variable de “config”.
const config = {
apiKey: "<API_KEY>",
authDomain: "<PROJECT_ID>.firebaseapp.com",
databaseURL: "https://<DATABASE_NAME>.firebaseio.com",
storageBucket: "<BUCKET>.appspot.com",
};
Para la parte de administrador, necesitamos generar una clave privada, el cual es un archivo en formato “JSON”, para ello entramos en la configuración del proyecto, después accedemos a Cuentas de Servicio y damos click a “Generar nueva clave privada”. El archivo que descargará lo guardamos en la carpeta del proyecto y lo renombramos a “firebase.json”. Dentro de la misma página, vamos a guardar el valor de la propiedad “databaseURL”.
Creando la función para obtener token
Vamos a crear un archivo llamado “token.js” en la carpeta raíz del proyecto, el cual importaremos el SDK de autenticación de firebase:
const firebase = require('firebase');
require('firebase/auth');
Posteriormente, importamos el SDK de administrador de firebase.
const admin = require('firebase-admin');
Una vez importados los paquetes, iniciamos la inicialización del SDK de administrador y cliente con el siguiente código:
const serviceAccount = require('./firebase.json');
const clientFire = firebase.initializeApp({
apiKey: "<API_KEY>",
authDomain: "<PROJECT_ID>.firebaseapp.com",
databaseURL: "https://<DATABASE_NAME>.firebaseio.com",
storageBucket: "<BUCKET>.appspot.com",
});
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: 'https://ejemplo.firebaseio.com'
});
Una vez realizado esto, podremos finalmente crear la función que nos genere el token:
module.exports = async() => {
const user = await admin.auth().createUser({
displayName: 'José José'
});
const tempToken = await admin.auth().createCustomToken(user.uid);
await clientFire.auth().signInWithCustomToken(tempToken);
const token = await clientFire.auth().currentUser.getIdToken();
return token;
}
Creando una simple prueba de integración
Para hacer esto, necesitamos instalar dos librerías: chai y supertest. > npm install –g mocha > npm install chai supertest --save-dev Creamos un archivo “prueba.test.js” en la carpeta “tests”:
const { expect, assert } = require('chai');
const request = require('supertest');
const token = require('../token');
let tempToken;
before(async () => {
tempToken = await token();
return tempToken;
});
describe('Prueba básica', () => {
it('should return status 200', async () => {
const response = await request('https://dominio.com')
.post('/ruta')
.set('x-api-token', token)
.expect(200);
});
});
Ejecutamos: > mocha --timeout 10000
