Как сгенерировать токен SAS для хранилища BLOB-объектов на языке дартс

В настоящее время я пытаюсь создать токен SAS для файла больших двоичных объектов на языке дартс. Я также взял ссылку из кода Python. В функции pythongenerate_sas_token() требуется идентификатор политики для хранилища BLOB-объектов Azure. где это взять

Это информация, которая у меня есть. Или есть ли какой-либо другой способ генерировать SDK, отличный от генерирования_sas_token() в Python. Причина в том, что я хочу создать токен SAS только через dart. Итак, мне нужен поток или метод для создания SAS.

заранее спасибо

import 'dart:convert';
import 'package:crypto/crypto.dart';
import 'package:intl/intl.dart';

String encode_signature(String signature){
  return signature.replaceAll(':', '%3A');
}

String generateSasToken(String accountName, String accountKey, String containerName, String blobName, int expiryHours) {
  var ttl = DateTime.now().add(Duration(hours: expiryHours)).millisecondsSinceEpoch ~/ 1000;
  
  var stringToSign = "r\n${DateFormat("yyyy-MM-ddTHH:mm:ssZ").format(DateTime.now().toUtc())}\n${DateFormat("yyyy-MM-ddTHH:mm:ssZ").format(DateTime.now().add(Duration(hours: expiryHours)).toUtc())}\n/$accountName/$containerName/$blobName\n\n\n\n\n\n\n";
  
  var hmacSha256 = Hmac(sha256, base64.decode(accountKey));
  var signature = base64.encode(hmacSha256.convert(utf8.encode(stringToSign)).bytes);
  
  var queryParams = {
    'sp': 'r',
    'st': DateFormat("yyyy-MM-ddTHH:mm:ssZ").format(DateTime.now().toUtc()),
    'se': DateFormat("yyyy-MM-ddTHH:mm:ssZ").format(DateTime.now().add(Duration(hours: expiryHours)).toUtc()),
    'sv': '2022-11-02',
    'sr': 'b',
    'sig': encode_signature(signature),//Uri.encodeComponent(signature).replaceAll('%3A', ':'), // Encode the signature component
  };

  var queryString = Uri(queryParameters: queryParams).query;

  return queryString;
}

void main() {
  var accountName = "account_name";
  var accountKey = "accountkey";
  var containerName = "azure-webjobs-hosts";
  var blobName = "0_12d6fa4202ac42bdbc33923c413c68ff_1.json";
  var expiryHours = 168;

  var sasToken = generateSasToken(accountName, accountKey, containerName, blobName, expiryHours);
  print(sasToken);
}

это код, который я сейчас запускаю, я могу получить, но единственная проблема в том, что Это SAS, созданный на портале Azure:

sp=r&st=2024-03-11T06:25:18Z&se=2024-03-11T14:25:18Z&sv=2022-11-02&sr=b&sig=sMX853JrU%2BkgAGgKTXS1XQRvFoh6%2BQQ3jNWRnG8LWVI%3D

Это генерируется приведенным выше кодом -

sp=r&st=2024-03-14T11%3A56%3A00&se=2024-03-21T11%3A56%3A00&sv=2022-11-02&sr=b&sig=jPsFzl2RoTJNGbMNg%252FwcT1oi%252FyIIBjFJeps1pJyMCGc %253D

Вместо двоеточия ":" я получаю "%3A". Хотя я использовал функцию replace all. В чем может быть проблема?

Токен генерируется, но

это часовой пояс на портале Azure но когда я создаю SAS на портале Azure, он дает следующий часовой пояс

В чем будет проблема. Разница во времени составляет примерно 5 часов 27 минут (минуты варьируются).

Следующий выпуск

Я могу создать действительный токен SAS для большого двоичного объекта. Я использовал то же самое для контейнера, но получил ошибку 403. Я думал, что генерация токена - это проблема, но позже попробовал сгенерированный на портале Azure токен sas для контейнера, все равно получая ту же ошибку 403, как это возможно? ниже приведен код, который я использовал для получения списка контейнеров

import 'dart:convert';
import 'dart:typed_data';
import 'package:crypto/crypto.dart';
import 'package:http/http.dart' as http;

void main() async {
  final String folderURL = 'https://myblobaccount.blob.core.windows.net/azure-webjobs-hosts?sp=r&st=2024-03-22T07:21:47Z&se=2024-03-22T15:21:47Z&sv=2022-11-02&sr=c&sig=Eg%2B04lD3EWLo2wGocU9mqNjKwqKmo04zSCH0Dbsjqlg%3D';//$storageBlobEndpoint/$containerName?$sasToken';

  // Make a request to list the blobs within the folder
  final response = await http.get(Uri.parse(folderURL));
  if (response.statusCode == 200) {
    final List<dynamic> blobs = json.decode(response.body);
    print("Files in the folder:");
    for (var blob in blobs) {
      print(blob['name']);
    }
  } else {
    print('Failed to fetch data: ${response.statusCode}');
  }
}

В чем может быть проблема?

пожалуйста, поделитесь кодом, который вы пробовали

Sampath 14.03.2024 13:32

@Sai Поднимите это в новой теме.

Venkatesan 22.03.2024 09:58

да, stackoverflow.com/questions/78205634/…

sai 22.03.2024 12:03
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
3
180
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Код ниже dart создает токен подписи общего доступа (SAS) для доступа к ресурсам хранилища BLOB-объектов Azure. Токены SAS предоставляют ограниченный доступ к ресурсам в вашей учетной записи хранения с указанными разрешениями и ограничениями по времени.

метод генерированияSasToken:

он генерирует токен SAS на основе предоставленных параметров, таких как ресурсUri, ключ, разрешения, SR и expiryHours.

import 'dart:convert';
import 'package:intl/intl.dart';
import 'package:crypto/crypto.dart';

class SasTokenGenerator {
  String generateSasToken({
    required String resourceUri,
    required String key,
    required String permissions,
    required String sr, // Added parameter for the resource type
    int expiryHours = 24,
  }) {
    DateTime startTime = DateTime.now(); // Adjusting start time by 5 minutes for clock skew
    DateTime expiry = startTime.add(Duration(hours: expiryHours));
    String formattedStartTime = DateFormat("yyyy-MM-ddTHH:mm:ss'Z'").format(startTime);
    String formattedExpiry = DateFormat("yyyy-MM-ddTHH:mm:ss'Z'").format(expiry);

    String stringToSign = 'sp=$permissions\nst=$formattedStartTime\nse=$formattedExpiry\nspr=https\nsv=2022-11-02\nsr=$sr\n$resourceUri'; // Include sr parameter
    String signature = _generateSignature(stringToSign, key);

    return 'sp=$permissions&st=$formattedStartTime&se=$formattedExpiry&spr=https&sv=2022-11-02&sr=$sr&sig=$signature'; // Include sr parameter
  }

  String _generateSignature(String input, String key) {
    var keyBytes = utf8.encode(key);
    var inputBytes = utf8.encode(input);
    var hmacSha256 = Hmac(sha256, keyBytes);
    var digest = hmacSha256.convert(inputBytes);
    return Uri.encodeComponent(base64.encode(digest.bytes));
  }
}

void main() {
  String resourceUri = "https://account_name.blob.core.windows.net/containerName/example.txt";
  String key = "accountkey";
  String permissions = "r"; // r for read, w for write, d for delete, etc.
  String sr = "b"; // Specify the resource type: b for Blob service, c for Container service, etc.
  int expiryHours = 24; // Expiry duration in hours

  SasTokenGenerator generator = SasTokenGenerator();
  String sasToken = generator.generateSasToken(
    resourceUri: resourceUri,
    key: key,
    permissions: permissions,
    sr: sr, // Pass sr parameter
    expiryHours: expiryHours,
  );

  print('Generated SAS Token: $sasToken');
}

Выход:

Не удалось получить данные: 403.

sai 18.03.2024 06:58

для ключа учетной записи я использовал ключ1 из этой учетной записи хранения места-> политика доступа-> ключ1. Это верно

sai 18.03.2024 07:00

правильно насчет политики доступа. Ошибка 403 может возникнуть из-за разницы во времени в Sas UTC и в обычном времени. если у вас возникла проблема, другой способ — использовать URL-адрес остального API в Dart и преобразовать остальной API в код dart

Sampath 19.03.2024 11:27

Я попытался изменить время UTC, но ошибка все равно напоминает то же самое.

sai 20.03.2024 06:22

Можете ли вы уточнить, что вы немного смутили в отношении REST API. Я пытаюсь генерировать динамически, а не генерировать sas каждый раз вручную. как только я получу sas, я прочитаю файл с помощью http.get(). Это то, что я пытаюсь сделать.

sai 20.03.2024 06:22

с rest api он также генерирует только время. Я также проверю с помощью http.get() sai

Sampath 20.03.2024 10:44

Да, а пока я пробую любые другие способы динамической генерации SAS. Я также проверил документ Learn.microsoft.com/en-us/rest/api/storageservices/… код вроде в порядке.

sai 20.03.2024 13:17

Хорошо, также проверьте с помощью http.get() .

Sampath 20.03.2024 13:30

Привет @sampath, все сработало. Я следил за документом и внес некоторые изменения в подписанные параметры. Я сомневаюсь, что для создания токена для контейнера также подойдет та же процедура. Моя проблема в том, что я хочу распечатать несколько файлов, помещенных в один контейнер, но BLOB-объекты хранятся следующим образом: Контейнер -> папка -> файлы BLOB-объектов.

sai 22.03.2024 05:58

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

Sampath 22.03.2024 06:59

Другие вопросы по теме

Хранилище BLOB-объектов Azure получает исключение AuthorizationPermissionMismatch при публикации BLOB-объекта с тегами
Контейнер Java Azure подключается через токен SAS
Azure: настройка аутентификации для хранилища BLOB-объектов в учетной записи хранения Azure из шлюза приложений
Ошибка FileNotFound при попытке чтения из хранилища BLOB-объектов Azure
Извлеките файл tar.gz из хранилища BLOB-объектов и загрузите извлеченный результат в другое хранилище BLOB-объектов
Проблема при загрузке файла из Azure Blob с помощью Blazor Wasm (ABP.IO)
Невозможно получить сообщение из очереди учетной записи хранения Azure в PowerShell
Библиотека Python для открытия дескриптора файла объекта хранилища BLOB-объектов Azure, аналогично библиотеке s3fs для AWS S3
Как внести в белый список только ограниченный IP-адрес для доступа к хранилищу BLOB-объектов
Настройка прокси-сервера для URL-адресов хранилища BLOB-объектов Azure

Похожие вопросы

Azure Pipeline Yaml; ошибка файла при запуске сценария Powershell
Как маршрутизировать запросы между портами на основе поддоменов?
Почему секрет клиента требуется при настройке единого входа Azure AD/Identity в Asp.net (устаревшая версия .Net Framework), но не требуется в ядре asp.net?
Условные переменные Azure Pipeline не работают должным образом
Как создать конвейер Azure DevOps через RestAPI и включить его
Невозможно подключиться к Azure SQL из контейнера веб-приложения Kubernetes (AKS) с использованием удостоверения рабочей нагрузки
Проблема при попытке обновить серверную часть операции Azure API Gateway через Terraform
Как передать переменные env в пользовательский контейнер в веб-приложении Azure
Как указать в шаблоне ARM, что для моей учетной записи хранения для параметра «Доступ к общедоступной сети» должно быть установлено значение «Отключено»?
Почему мой конвейер Azure DevOps выводит на сервер файлы, которых нет в опубликованном артефакте?