Conectando API en .Net 5 con firebase storage

airarrazabald

Abelardo Ruben Irarrázabal Díaz

Posted on August 4, 2022

Conectando API en .Net 5 con firebase storage

Actualmente tenemos una variedad de alternativas para guardar documentos o imagenes, sobre todo de opciones en la nube. Una de las alternativas puede ser firebase storage que nos permite conectarnos desde cualquier app indpeendiente el lenguaje. En esta ocasión integraremos una Api en .Net 5 con firebase storage.

Este post esta divididos en tres partes:

  1. Creación de proyecto en firebase
  2. Crear un usuario en firebase
  3. Integración de Api en .Net 5

Creación de proyecto en firebase

Primero debemos contar con una cuenta de google.
Luego debemos ingresar a la consola de firebase

Creamos un nuevo poyecto
Nuevo Proyecto

Paso 1: Nombre del proyecto
Nombre del proyecto

Paso 2: desactivamos google analitycs para el proyecto
Image description

Una vez creado el proyecto seleccionamos storage del menu
Image description

Iniciamos en modo producción y seleccionamos ubicación

En la sección reglas (rules) copiamos y pegamos el siguiente código



rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}


Enter fullscreen mode Exit fullscreen mode

Crear un usuario en firebase

Para poder acceder a firebase storage debemos crear un usuario en la sección Authentication y le damos a comenzar

sección autenticación

Seleccionamos el metodo de autenticación por correo electrónico

Metodo autenticación

habilitación

En la pestaña users agregamos un nuevo usuario

nuevo usuario

Integración de Api en .Net 5

Ya realizados los pasos anteriores, estamos listos para conectar nuestra api .Net 5 a firebase. Para ello utilizaremos el código del siguiente repositorio:
Net Core Firebase Storage

El proyecto se divide en tres capas

  • FirebaseStorageApp
  • FirebaseStorageApp.Model
  • FirebaseStorageApp.Services

FirebaseStorageApp

Es nuestra api donde exponemos el endpoint para cargar documentos:



[HttpPost]
public async Task<IActionResult> Post([FromBody] FileModel file)
{
    string fileUrlFirebase = await Upload(file);
    return Ok(new { fileUrlFirebase });
}

private static async Task<string> Upload(FileModel file)
{
    var fileFromBase64ToStream = FirebaseStorageService.ConvertBase64ToStream(file.FileBase64);
    var fileStream = fileFromBase64ToStream.ReadAsStream();

    string fileUrlFirebase = await FirebaseStorageService.UploadFile(fileStream, file);
    return fileUrlFirebase;
}


Enter fullscreen mode Exit fullscreen mode

Para este ejemplo utilizaremos variables de entorno con las keys necesarias para conectarse a firebase. Estas variables debemos reemplazarlas en el archivo Properties/launchSettings.json:



"IIS Express": {
    "commandName": "IISExpress",
    "launchBrowser": true,
    "launchUrl": "swagger",
    "environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development",
    "API_KEY_STORAGE": "Your api key storage",
    "AUTH_EMAIL": "your email authentication ",
    "AUTH_PASWORD": "your password autenticaction",
    "BUCKET_STORAGE": "your bucket name"
    }
}


Enter fullscreen mode Exit fullscreen mode

AUTH_EMAIL y AUTH_PASWORD: debemos ingresar las configuradas en el paso 2 de este post.

API_KEY_STORAGE: en firebase la obtenemos en Configuración del proyecto < General:
Image description

BUCKET_STORAGE: en firebase la obtenemos en storage omitiendo gs://:
Image description

FirebaseStorageApp.Model

En esta capa tenemos la clase con los datos que solicitaremos para guardar documentos. Esta sera utilizada en el controlador y la capa de servicio.



public class FileModel
{
    [Required(ErrorMessage = "This field is required")]
    [MinLength(5, ErrorMessage = "5 characters is required")]
    public string FileBase64 { get; set; }

    [Required(ErrorMessage = "This field is required")]
    [MinLength(5, ErrorMessage = "5 characters is required")]
    public string FileName { get; set; }

    [Required(ErrorMessage = "This field is required")]
    [MinLength(5, ErrorMessage = "5 characters is required")]
    public string FolderName { get; set; }
}


Enter fullscreen mode Exit fullscreen mode

FirebaseStorageApp.Services

Esta es nuestra capa de servicio en donde conectaremos con firebase.
Para ello debemos instalar dos nugget package, FirebaseAuthentication.net y FirebaseStorage.net:

Image description

Una vez descargados ya podemos concectarnos con la siguiente clase:



public static class FirebaseStorageService
{
    private static readonly string _apiKey = Environment.GetEnvironmentVariable("API_KEY_STORAGE");
    private static readonly string _bucket = Environment.GetEnvironmentVariable("BUCKET_STORAGE");
    private static readonly string _email = Environment.GetEnvironmentVariable("AUTH_EMAIL");
    private static readonly string _Password = Environment.GetEnvironmentVariable("AUTH_PASWORD");

    public static StreamContent ConvertBase64ToStream(string fileBase64)
    {
        byte[] stringToBase64 = Convert.FromBase64String(fileBase64);
        StreamContent streamContent = new(new MemoryStream(stringToBase64));
        return streamContent;
    }

    public static async Task<string> UploadFile(Stream stream, FileModel file)
    {
        string fileFromFirebaseStorage = string.Empty;
        FirebaseAuthProvider firebaseConfiguration = new(new FirebaseConfig(_apiKey));

        FirebaseAuthLink authConfiguration = await firebaseConfiguration
            .SignInWithEmailAndPasswordAsync(_email, _Password);

        CancellationTokenSource cancellationToken = new();

        FirebaseStorageTask storageManager = new FirebaseStorage(_bucket,
            new FirebaseStorageOptions
            {
                AuthTokenAsyncFactory = () => Task.FromResult(authConfiguration.FirebaseToken),
                ThrowOnCancel = true
            })
            .Child(file.FolderName)
            .Child(file.FileName)
            .PutAsync(stream, cancellationToken.Token);

        try
        {
            fileFromFirebaseStorage = await storageManager;
        }
        catch (Exception e)
        {
        }
        return fileFromFirebaseStorage;
    }
}


Enter fullscreen mode Exit fullscreen mode

Explicado el codigo de forma general ya estamos en condiciones de cargar nuestros archivo. En el siguiente link puedes obtener el json dejemplo para probar la api: Example Body

Image description

Al ejecutar el post el endpoint nos devolvera la url para visualizar el documento cargado:



{
  "fileUrlFirebase": "https://firebasestorage.googleapis.com/v0/b/pruebas-fc979.appspot.com/o/documents%2Fpdf_prueba?alt=media&token=6a52c316-661a-48b6-8505-206f3a4b202a"
}


Enter fullscreen mode Exit fullscreen mode

Si revisamos en la consola veremos el nuevo archivo cargado
Image description

💼 Mi Portafolio

💖 💪 🙅 🚩
airarrazabald
Abelardo Ruben Irarrázabal Díaz

Posted on August 4, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related