Подключение API в .Net 5 с помощью хранилища firebase

Сегодня у нас есть множество альтернатив для хранения документов или изображений, особенно облачные варианты. Одной из альтернатив может быть хранилище firebase, которое позволяет нам подключаться из любого приложения, независимо от языка. На этот раз мы интегрируем Api в .Net 5 с хранилищем firebase.

Этот пост состоит из трех частей:

  1. Создание проекта firebase
  2. Создание пользователя в firebase
  3. Интеграция Api в .Net 5

Создание проекта firebase

Сначала мы должны завести учетную запись google.
Затем мы должны войти в консоль firebase

Создайте новый проект

Шаг 1: Название проекта

Шаг 2: Деактивируйте google analitycs для проекта.

После создания проекта мы выбираем в меню пункт хранения

Запустите в режиме производства и выберите местоположение

В разделе правил мы копируем и вставляем следующий код

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Создание пользователя в firebase

Чтобы получить доступ к хранилищу firebase, мы должны создать пользователя в разделе Authentication и нажать кнопку start

Выбираем метод аутентификации по электронной почте

На вкладке пользователи мы добавляем нового пользователя

Интеграция Api в .Net 5

После выполнения предыдущих шагов мы готовы подключить наш .Net 5 api к firebase. Для этого мы будем использовать код из следующего репозитория:
Net Core Firebase Storage

Проект разделен на три уровня

  • FirebaseStorageApp
  • FirebaseStorageApp.Model
  • FirebaseStorageApp.Services

FirebaseStorageApp

Это наш api, где мы выставляем конечную точку для загрузки документов:

[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;
}
Войдите в полноэкранный режим Выход из полноэкранного режима

В данном примере мы будем использовать переменные окружения с необходимыми ключами для подключения к firebase. Эти переменные должны быть заменены в файле 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"
    }
}
Войдите в полноэкранный режим Выход из полноэкранного режима

AUTH_EMAIL и AUTH_PASWORD: мы должны ввести те, которые были настроены в шаге 2 этого поста.

API_KEY_STORAGE: в firebase мы получаем его в Project Settings < General:

BUCKET_STORAGE: в firebase мы получаем его в хранилище, опустив gs://:

FirebaseStorageApp.Model

В этом слое у нас есть класс с данными, которые мы будем запрашивать для сохранения документов. Это будет использоваться в контроллере и сервисном уровне.

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; }
}
Войдите в полноэкранный режим Выход из полноэкранного режима

FirebaseStorageApp.Services

Это наш сервисный уровень, на котором мы будем подключаться к firebase.
Для этого нам нужно установить два пакета nugget, FirebaseAuthentication.net и FirebaseStorage.net:

После загрузки мы можем подключиться к следующему классу:

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;
    }
}
Войдите в полноэкранный режим Выход из полноэкранного режима

После того, как код был объяснен в общих чертах, мы готовы к загрузке наших файлов. По следующей ссылке вы можете получить пример json для тестирования api: Пример тела

При выполнении сообщения конечная точка вернет url для визуализации загруженного документа:

{
  "fileUrlFirebase": "https://firebasestorage.googleapis.com/v0/b/pruebas-fc979.appspot.com/o/documents%2Fpdf_prueba?alt=media&token=6a52c316-661a-48b6-8505-206f3a4b202a"
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Если мы проверим в консоли, то увидим новый загруженный файл

Оцените статью
devanswers.ru
Добавить комментарий