Minio клиент REST. Как скачать файл?
Предыстория:
Есть сервер приложения-хранилище файлов. На нём работают сервисы TUS и Minio. Моя задача - написать клиент на 1С для работы с этой мутью. Файлы загружаются без проблем, ссылки на скачивание получаю вот в таком виде http://192.168.Х.Х:8000/minio_download/example_body_id/730c57d1726f006016f7be82b21df7a0
В кластере Minio авторизуюсь, получаю токен, секрет и т.д.
Вопрос:
Как построить запрос, чтобы скачать файл?
Пробовал GET с реквизитами в заголовках - Access Denied
На POST с реквизитами в теле, как x-www-form-urlencoded отвечает Unsupported action (добавлял заголовок Action).
А каким должен быть Action для скачивания нагуглить не смог. Подскажите, пожалуйста
P.S. Описание любого механизма получения файла от минио также будет полезным. Возможно стоит изменить подход к вопросу именно скачивания
Ответы (2 шт):
В общем, разобрались вместе с коллегой. Минио требует авторизацию типа AWS Signature (https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-auth-using-authorization-header.html). Так, например, выглядит страница авторизации в постмане.
Запрос должен быть GET. Никаких хедеров Action не нужно.
В первую очередь авторизуетесь в Минио.
Запрос POST, Content-Type:application/x-www-form-urlencoded, тело: Action=AssumeRoleWithWebIdentity&WebIdentityToken=<Ваш JWT-Токен>&Version=2011-06-15. Токен получаете от вашего OIDC-провайдера (у нас Keyclock).
Минио возвращает вам реквизиты авторизации в виде XML
<?xml version="1.0" encoding="UTF-8"?>
<AssumeRoleWithWebIdentityResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
<AssumeRoleWithWebIdentityResult>
<AssumedRoleUser>
<Arn></Arn>
<AssumeRoleId></AssumeRoleId>
</AssumedRoleUser>
<Credentials>
<AccessKeyId>123456GHTREWXvb789</AccessKeyId>
<SecretAccessKey>lP+123456zxcvbnsdfER+987654QWertTYYUlkjGHJDs</SecretAccessKey>
<Expiration>2022-07-25T06:32:04Z</Expiration>
<SessionToken>eyJhbGciOiJIUzUxMiIxxxxxxxxxxxxxxxxx.eyJhY2Nlc3NLZXkiOiI1VDVHSktVQjc5T1NSSEY4UlZDOSIsImFjciI6IjEiLCJhdWQiOiJzZWN1cml0eS1hZG1pbi1jb25zb2xlIiwiYXV0aF90aW1lIjoxNjU4NzE5OTI0LCJhenAiOiJhY2NvdW50IiwiY2xpZW111111111111CIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJleHAiOjE2NTg3MzA3MjQsImlhdCI6MTY1ODcxOTkyNSwiaXNzIjoiaHR0cDovLzE5Mi4xNjguNy4yMz00000000000XRoL3JlYWxtcy9PcxxxxxxxxxxxxxOiI5ZmFiODgwMi1iZDU5LTQ4MmMtOTdjZi0xMDU2N2MzNWEwN2UiLCJwb2xpY3kiOiJyZWFkd3JpdGUiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0dXNlciIsInJlffffffffffY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmttttttttttttttttbWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXBxxxxxxxxxxY29wZSI6InByb2ZpbGUgZW1haWwiLCJzZXNzaW9uX3N0YXR1111111111110Ny00Y2Y4LWFlNmMtMmYzZTBmNzkzMDRlIiwic2lkIjoiZTEyNWU4MzQtYjc0Ny00Y2Y4LWFlNmMtMmYzZTBmNzkzMDRlIiwic3ViIjoiYzE5MGZjYTQtODU1Zi00ZTBuuuuuuuuuuuM2RlN2VmIiwidHlwIjoiQmVhcmVyIn0.-QExxh-DCosh2SFEQx2rjViXctmlOoebamVdAgE8ra2wRrv47EPmw2vKbSX1k_qyQcqBLu6_W5ylsIyNEhLZ9Q</SessionToken>
</Credentials>
<SubjectFromWebIdentityToken>xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx</SubjectFromWebIdentityToken>
</AssumeRoleWithWebIdentityResult>
<ResponseMetadata>
<RequestId>1704F503B2180C47</RequestId>
</ResponseMetadata>
</AssumeRoleWithWebIdentityResponse>
Подставляем в хедеры запроса на скачивание AccessKeyId в AccessKey и SecretAccessKey в SecretKey.
Для построения запроса AccessKeyId устанавливается в заголовок Authorization после Credential=, а на основании SecretKey придется посчитать сигнатуру, как описано в доках амазона по ссылке выше. В заголовок X-Amz-Content-Sha256 подставляем хеш-256 пустой строки: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855, потому что в нашем запросе нет тела.
P.S.: Собственно весь алгоритм и описан в документации на Amazon Simple Storage Service.
P.P.S.: А вот в этом репозитории пример работы с сервисами Амазона из 1С. Спасибо автору ftomza https://gist.github.com/ftomza/2381166bf053b00688b97aa2938a5e44
Нужно разрешить скачивание сторонними пользователями. Пишем команды в консоле где установлен minio
mc alias set local http://localhost:9000 ВАШ_MINIO_ACCESS_KEY ВАШ_MINIO_SECRET_KEY
далее команду
mc anonymous set download local/ВАШ_BASKET
Далее нужно в корзине где хранятся файлы прописать в разрешениях в вкладке readonly Слудующее
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::ВАШ_Basket/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::ВАШ_Baske/*"
]
}
]
}
Затем ваши файлы будут доступны по адресу что-то типа такого
http://192.168.Х.Х:8000/ВАШ_Basket/вложенная_папка/ваш_файл.расширание
