Crea un proyecto en Firebase programáticamente

0
990
Proyecto de firebase compuesto por el proyecto en GCP y los servicios de Firebase

Si alguna vez has creado un proyecto de Firebase para utilizarlo con tu aplicación, lo más probable es que lo hayas hecho a mano utilizando la consola de Firebase. Sin embargo, gracias a las APIs de Google Cloud Platform, es posible automatizar esta tarea y así crear estos proyectos programáticamente.

  1. Introducción
  2. Entorno
  3. Requisitos y restricciones
  4. Preparación del entorno
  5. Crear un proyecto en GCP
  6. Añadir los servicios de Firebase
  7. Siguientes pasos

Introducción

A la hora de crear un proyecto en Firebase manualmente, lo solemos hacer con nuestra cuenta personal (o la del trabajo), teniendo que utilizar un navegador. Para automatizar la tarea vamos a hacer uso de las cuentas de servicio (o service accounts) que nos permiten realizar acciones sobre nuestros recursos en Google Cloud Platform (GCP) sin tener que iniciar sesión con un usuario y contraseña.

Entorno

Requisitos y restricciones

Una de las restricciones que pone Google para crear un proyecto utilizando una cuenta de servicio es que el proyecto se cree bajo una organización (o una carpeta dentro de una organización). Lamentablemente, esto solo se puede hacer si nuestra cuenta está asociada a una organización, habitualmente porque pertenece a una empresa.

Si abrimos la consola de Google Cloud Platform y abrimos los proyectos (de una cuenta personal) veremos que están bajo «Sin organización».

Aparte, para poder tener una cuenta de servicio, debemos haber creado anteriormente un proyecto, tal y como se explica en el siguiente punto. Es decir, no se puede automatizar la creación del primer proyecto de la organización.

Preparación del entorno

Para poder automatizar la creación de proyectos, vamos a configurar de antemano lo siguiente:

  • Un proyecto en GCP.
  • Una cuenta de servicio y sus credenciales.
  • Activar las APIs de administración.

Para el primer punto podemos crear un nuevo proyecto o utilizar uno que ya tengamos. Si lo que queremos es crear uno nuevo, abrimos la consola de Google Cloud y, si no tenemos ningún otro proyecto creado, nos guiará en la creación. Si tenemos ya un proyecto creado pero queremos crear otro, debemos pulsar en el nombre del proyecto seleccionado (en la parte superior izquierda) y pulsar sobre «Proyecto Nuevo» en la ventana que aparece.

Una vez tengamos el proyecto, podemos generar la cuenta de servicio. Esta cuenta nos permite realizar acciones sobre los servicios de Google sin tener que iniciar sesión como persona. Para crear una cuenta de servicio, tenemos que abrir el menú de navegación (botón superior izquierdo), pulsar sobre «IAM y administración» y finalmente sobre «Cuentas de servicio».

Debemos asegurarnos que el proyecto seleccionado que aparece en la barra superior es el que queremos utilizar para crear la cuenta de servicio. Una vez asegurado, y dentro del panel de administración de las cuentas de servicio, pulsamos sobre «Crear cuenta de servicio».

Botón para crear una cuenta de servicio

Podemos seguir los pasos y poner los datos que queramos para crear la cuenta. Una vez la hayamos creado, pulsamos la cuenta que hemos generado en la lista de cuentas de servicio. Esto abrirá la configuración donde debemos pulsar en la pestaña «Claves».

Botón para crear claves de una cuenta de servicio

En este panel, pulsamos sobre el botón «Agregar clave» y después sobre «Crear clave nueva». En este paso se abrirá un mensaje preguntando por el tipo que queremos, pulsaremos «JSON» y después sobre el botón «Crear». Ahora se descargará un fichero en formato JSON que tendrá las claves que vamos a necesitar más adelante para poder crear proyectos.

Por último, debemos activar las APIs de administración (Cloud Resource Manager API y Firebase Management API). Para ello, en la misma consola de Google Cloud, abrimos el menú de navegación, vamos al apartado de «API y servicios» y pulsamos sobre «Biblioteca».

Pasos para abrir la biblioteca de API y servicios

Se abrirá un buscador en el que debemos buscar y activar los servicios necesarios, Cloud Resource Manager API y Firebase Management API.

Cloud Resource Manager API y Firebase Management API

Con esto ya tenemos todo lo que debemos generar y activar. Además, podemos buscar también el ID de la organización o de la carpeta donde queramos crear el proyecto. Podemos hacer esto pulsando en el nombre del proyecto en la parte superior izquierda y pulsando en «Todos» para ver los identificadores.

Crear un proyecto en GCP

El primer paso que debemos seguir para crear un proyecto de Firebase es crear un proyecto en Google Cloud Platform. Esto se debe a que los proyectos de Firebase son en sí proyectos de Google Cloud Platform a los que se les ha añadido los servicios de Firebase.

Proyecto de firebase compuesto por el proyecto en GCP y los servicios de Firebase

Para crear el proyecto en GCP debemos realizar la llamada al endpoint de creación de proyectos de Cloud Resource Manager API. Dentro de la documentación se muestra cómo realizar la acción con diferentes librerías en diferentes lenguajes de programación, aunque también se puede hacer llamando a los endpoints directamente. En este caso, usaremos la librería de Java en Kotlin. Estas librerías se deben añadir al proyecto de antemano, ya sea usando maven, gradle u otros.

El primer paso es obtener la autorización para la creación del proyecto con las credenciales en formato JSON de la cuenta de servicio. Hay dos formas de configurar las credenciales para que sean utilizadas, se puede añadir la ruta del fichero en la variable de entorno GOOGLE_APPLICATION_CREDENTIALS y utilizar en Kotlin las credenciales por defecto o pasar las credenciales como String a la librería. En este caso vamos a utilizar la segunda opción.

private val credentials = "json credentials file content"

private fun createCloudResourceManagerService(): CloudResourceManager {
    val httpTransport: HttpTransport = GoogleNetHttpTransport.newTrustedTransport()
    val gsonFactory: GsonFactory = GsonFactory.getDefaultInstance()
    var credential = GoogleCredential.fromStream(credentials.byteInputStream())
    if (credential.createScopedRequired()) {
        credential = credential.createScoped(Arrays.asList("https://www.googleapis.com/auth/cloud-platform"))
    }
    return CloudResourceManager.Builder(httpTransport, gsonFactory, credential)
        .setApplicationName("Google-CloudResourceManagerSample/0.1")
        .build()
}

En el código tenemos, por un lado, las credenciales, un String con el contenido del fichero que descargamos, y, por otro lado, tenemos la creación de CloudResourceManager que nos permitirá crear el proyecto con las credenciales que se incluyen con GoogleCredential. Se puede cambiar la forma en la que se pasan las credenciales, además del String en setApplicationName, que puede ponerse cualquiera.

El siguiente paso es crear el proyecto con los valores necesarios.

fun createProject() {
    val requestBody = Project()
    requestBody.projectId = "unique-project-id"
    requestBody.name = "Project name"
    requestBody.parent = ResourceId().setId("organization id number").setType("organization")
    
    val cloudResourceManagerService = createCloudResourceManagerService()
    val request = cloudResourceManagerService.projects().create(requestBody)
    val response = request.execute()
    println(response)
}

Los valores que debemos cambiar son los que hay en requestBody, que serán referentes a nuestro proyecto: projectId que tiene que ser un identificador único en todo Google Cloud Platform, por lo que hay que tener cuidado al elegirlo, name con el nombre que queramos que se muestre en el proyecto y parent con el identificador de la organización o carpeta y los valores «organization» o «folder» como tipo.

Con esto ya podemos crear el proyecto en Google Cloud Platform. Debemos tener cuidado a la hora de generar el proyecto en GCP y después añadirle los servicios de Firebase (en el siguiente punto), ya que la creación del proyecto puede tomar unos minutos. Por lo tanto, es recomendable que las dos acciones no se hagan seguidas, sino que haya un tiempo de espera entre la primera y la segunda.

Añadir los servicios de Firebase

Una vez se ha creado el proyecto en GCP, podemos añadirle los servicios de Firebase y así tener un proyecto de Firebase. Para añadir los servicios de Firebase debemos realizar una llamada al endpoint de Firebase Management API. En este caso no disponemos de una librería para realizar la acción, por lo que debemos realizar la petición al endpoint directamente.

Debemos realizar una petición POST al endpoint https://firebase.googleapis.com/v1beta1/{project=projects/*}:addFirebase añadiendo la cabecera de autorización. Para ello, vamos a obtener primero el token de acceso con la librería de GoogleCredentials.

private val credentials = "json credentials file content"

private fun getAccessToken(): String {
    return GoogleCredentials
        .fromStream(credentials.byteInputStream())
        .createScoped(
            "https://www.googleapis.com/auth/cloud-platform",
            "https://www.googleapis.com/auth/firebase"
        ).refreshAccessToken()
        .tokenValue
}

Ahora ya podemos realizar la petición para añadir los servicios de Firebase al proyecto. Vamos a utilizar la librería khttp para la petición, pero se puede utilizar cualquier otra.

private val projectId = "id of the gcp project"

fun addFirebaseServices() {
    val response = khttp.post(
        url = "https://firebase.googleapis.com/v1beta1/projects/$projectId:addFirebase",
        auth = BearerAuthorization(accessToken),
        data = mapOf("locationId" to "")
    );

    println(response.text);
}

data class BearerAuthorization(val token: String) : Authorization {
    override val header: Pair<String, String>
        get() {
            return "Authorization" to "Bearer $token"
        }
}

En esta llamada debemos cambiar el valor de projectId por el identificador que hayamos puesto al proyecto en el punto anterior. Podemos observar también que el cuerpo de la petición tiene el dato locationId como vacío. Esto se debe a que el valor ha sido deprecado, pero sigue siendo necesario para que la petición concluya correctamente. En este caso, se ignora su valor.

Después de realizar este paso, el proyecto ya debería tener los servicios de Firebase. Si todo ha funcionado correctamente, podemos abrir la consola de Firebase y comprobar que, efectivamente, el nuevo proyecto aparece.

Siguientes pasos

Ahora que ya tenemos el proyecto creado podemos seguir utilizando las librerías de GCP y Firebase management para configurar el proyecto como queramos.

Por ejemplo, podemos añadir una cuenta de facturación al proyecto de GCP para cambiar el plan a uno de pago (si lo necesita nuestro proyecto). También podemos añadir a Firebase aplicaciones de Android, iOS y Web y así poder conectarlas al proyecto automáticamente.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad