Bye bye Firebase Token 👋🏻 Hola Cuentas De Servicio 🫶🏻

Carlos Daniel
4 min readNov 1, 2024

--

Photo by Shubham Dhage on Unsplash

Si quieres leer la versión en inglés, puedes hacerlo aquí.

El problema

Hasta hace algunos meses, siempre usé el token que generaba Firebase desde el CLI para subir los ejecutables de mis apps a Firebase Distribution. El procedimiento era: desde la ventana de comandos me logeaba a Firebase con firebase login:ci, lo que me generaba un token del tipo:

1//8878yfP-b1jdQCgYIARAAGAUSNwF-L9IrAqSHHAB9JarbkcxO_jVTUtcoLWuvR0yem0GOge7HBnHoNeVUCjNHMo1efhGGQFZToOY

Este token lo guardaba en mis secretos de Github Actions, y cuando desde mis workflows llamaba a mis lanes de Fastlane para subir a Firebase, el ejecutable se subía sin ningún problema y sin tener que regenerar el token.

Llegó un día en el cual mis workflows fallaban cuando intentaba subir a Firebase, usualmente con errores del tipo:

🔐 Authenticating with FIREBASE_TOKEN environment variable
[15:52:14]: ❌ Error in Firebase App Distribution: App Distribution could not generate credentials from the refresh token specified.
Refresh token used: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX7ZdC0" (redacted)
Authorization failed. Server message:
{
"error": "invalid_grant",
"error_description": "reauth related error (invalid_rapt)",
"error_uri": "https://support.google.com/a/answer/9368756",
"error_subtype": "invalid_rapt"
}
Response status: 400 ⁠

Se hizo peor

Y al regenerar el token, y reemplazarlo en los secretos, el proceso funcionaba, pero se volvió agotador tener que hacer esto cada vez que fuera a generar una versión automáticamente, pues ya el proceso no era automático. invalid_rapt es un claro mensaje que indica que necesitaba usar un proceso de autenticación más robusta

Así, la solución más común es usar el enfoque de autenticación basado en Google Service Account en lugar del token de Firebase. Es una solución que no expira, es más segura para el proceso de CI/CD y ahora mismo es el método recomendado por Firebase.
Por tanto, cambié la forma de autenticarme en Firebase para mis proyectos y eso es lo que les compartiré de forma rápida.

El nuevo proceso :)

Lo primero, es ir a la configuración del proyecto en y seleccionar la opción de Cuentas de servicio .

Firebase console: Cuentas de servicio

Allí, encontraremos la opción para “Generar nueva clave privada”:

Hacemos en Generar clave y guardamos el JSON que genera:

Me gusta encodear los contenidos de estos archivos (de hecho es lo sugerido), así que después de descargarlo, lo que hago es encodearlo en base64 y el nuevo contenido es el que subo como secreto a Github:

Github Settings — Secrets and variables

Para ello, vamos a los Settings del proyecto en Github > Secrets and variables > Actions y lo agregamos:

New action secret

Ahora, ya podemos referenciar este secreto desde nuestros archivos de workflow de la siguiente manera:
en los jobs de mi workflow yaml file, en la seccíon de variables de entorno, referenciamos el secreto creado y se lo asignamos a la variable FIREBASE_SERVICE_ACCOUNT_JSON.

Su contenido lo decodificamos y creamos el archivo service-account.json y lo ubicamos en una ruta de nuestro proyecto para que cuando se empaquete, pueda acceder a los permisos de autenticación para subir a App Distribution:

      - name: Prepare Staging Env Variables
env:
# other variables
FIREBASE_SERVICE_ACCOUNT_JSON: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_JSON_STAGING }}
run: |
mkdir -p path/to/put/service-account.json
echo $FIREBASE_SERVICE_ACCOUNT_JSON | base64 --decode > android/fastlane/firebase/service-account.json
## not a must but we can setup permissions and a check
chmod 644 path/to/put/service-account.json
ls -la path/to/put/service-account.json

Luego, en el archivo de Fastfile de android, en el lane de firebase_app_distribution agregamos la opción de service_credentials_file referenciando la ruta que definimos en el workflow.

firebase_app_distribution(
app: "my_app-id",
android_artifact_type: "APK",
android_artifact_path: "#{root_path}/build/app/outputs/flutter-apk/app-release.apk",
release_notes: changelog,
groups: "internal",
service_credentials_file: "#{root_path}/path/to/put/service-account.json",
debug: true
)

Con esto, la configuración de las credenciales de la cuenta de servicio quedan enlazadas al lane, y este sube el ejecutable sin problemas.

Y con lo anterior, le decimos bye bye! a Firebase Token y le damos la bienvenida, hello! a Cuentas de servicio.

Si te gustó el contenido, 50 aplausos 👏🏻 me vienen muy bien para que este pueda llegar a más personas que necesiten de estas guías.

--

--

Carlos Daniel
Carlos Daniel

Written by Carlos Daniel

Android & Flutter Developer. GDE for Android & Mobile Engineer.

No responses yet