Спасибо за вашу поддержку @Gaurav Mantri и @Mark Brown. Ваши комментарии помогли избежать смерти из-за миллиона порезов: -)
Я запустил хранилище, где собираю Azure CLI bash сценарии. Найдите его в https://github.com/Krumelur/AzureScripts
Позвольте мне ответить на мой собственный вопрос (-ы) и предоставить скрипт, который читает существующие БД в экземпляре CosmosDB.
Это начинается интерактивный вход в систему в окне браузера.
az login
Укажите, к какому ресурсу мы хотим получить доступ. URI вместе с необходимыми значениями параметров можно найти по адресу: https://docs.microsoft.com/en-us/rest/api/cosmos-db/cosmosdb-resource-uri-syntax-for-rest
comsosDbInstanceName="YOUR INSTANCE NAME GOES HERE"
baseUrl="https://$comsosDbInstanceName.documents.azure.com/"
verb="get"
resourceType="dbs"
resourceLink="dbs"
resourceId=""
Получить мастер-ключ CosmosDB. Нам нужно это, чтобы получить доступ. Это тот же ключ, который можно найти на портале в разделе «Ключи» экземпляра CosmosDB. Первичный ключ - это то, что API REST называет «главным» ключом.
masterKey=$(az cosmosdb keys list --name $comsosDbInstanceName --query primaryMasterKey --output tsv)
echo "Masterkey: $masterKey"
API-интерфейсу REST CosmosDB требуется хешированный заголовок авторизации: https://docs.microsoft.com/de-de/rest/api/cosmos-db/access-control-on-cosmosdb-resources#authorization -header
Чтобы получить дату в формате HTTP, языковой стандарт должен быть установлен на США. В противном случае названия дней будут локализованы (например, на немецкий язык).
Формат HTTP напрямую не поддерживается bash. Чтобы это работало, установите текущий часовой пояс на GMT. Формат времени выглядит следующим образом: «понедельник, 27 апреля 2020 г., 09:46:58 гм».
now=$(env LANG=en_US TZ=GMT date '+%a, %d %b %Y %T %Z')
echo "Date: " $now
Глагол Concat, тип ресурса, идентификатор ресурса и дата в ожидаемом формате. REST API ожидает, что подпись будет в нижнем регистре.
«Маленькая» проблема, о которой я не знал: завершающие символы новой строки (\n
) всегда усекаются при выводе строки. Это сломало бы ха sh, потому что CosmosDB ожидает, что они будут там. Вот почему два завершающих символа новой строки добавляются после операции в нижнем регистре.
signature="$(printf "%s" "$verb\n$resourceType\n$resourceId\n$now" | tr '[A-Z]' '[a-z]')\n\n"
echo "Signature: $signature"
Рассчитайте га sh подписи, используя первичный ключ экземпляра CosmosDB. См. https://superuser.com/questions/1546027/what-is-the-openssl-equivalent-of-this-given-c-hashing-code/1546036, чтобы узнать, почему это так сложно. TL; Dr; версия: OpenSSL и реализация сервера по-разному интерпретируют ключ хеширования.
hexKey=$(printf "$masterKey" | base64 --decode | hexdump -v -e '/1 "%02x"')
echo "Hex key: " $hexKey
hashedSignature=$(printf "$signature" | openssl dgst -sha256 -mac hmac -macopt hexkey:$hexKey -binary | base64)
echo "Hashed signature: $hashedSignature"```
Ожидается, что хешированная подпись будет закодирована в URL. Но, конечно, в bash нет встроенного способа сделать это. Geez. К счастью, мы имеем дело со строкой base64. Единственный символ, который нуждается в кодировании, это знак равенства, который становится "% 3d".
Создайте заголовок авторизации, используя формат "type = {typeoftoken} & ver = {tokenversion} & sig = {hashsignature}"
authString="type=master&ver=1.0&sig=$hashedSignature"
echo "Auth string: $authString"
Ожидается, что строка аутентификации будет закодирована в URL. Но, конечно, в bash нет встроенного способа сделать это. Geez. Это не полная кодировка base64, а только изменяет символы, которые мы можем видеть: = ->% 3d, & ->% 26, + =>% 2b, / =>% 2f
urlEncodedAuthString=$(printf "$authString" | sed 's/=/%3d/g' | sed 's/&/%26/g' | sed 's/+/%2b/g' | sed 's/\//%2f/g')
echo "URL encoded auth string: $urlEncodedAuthString"
Make вызов API путем объединения базового URL и ссылки на ресурс.
url="$baseUrl$resourceLink"
echo "URL: $url"
Можно использовать команду "az rest":
az rest --verbose -m $verb -u $url --headers x-ms-date="$now" x-ms-version=2018-12-31 x-ms-documentdb-isquery=true Content-Type=application/query+json Authorization=$urlEncodedAuthString --debug
Альтернатива: использовать cURL
curl --request $verb -H "x-ms-date: $now" -H "x-ms-version: 2018-12-31" -H "x-ms-documentdb-isquery: true" -H "Content-Type: application/query+json" -H "Authorization: $urlEncodedAuthString" $url