Как создать подпись общего доступа Azure для BLOB-объекта / контейнера? - PullRequest
0 голосов
/ 24 мая 2019

Учитывая мои ограничения среды и то, что SAS кажется простым токеном, я хотел бы сгенерировать его "вручную".

Я пытался следовать документации Microsoft о том, как работает SASгенерируется, но я всегда получаю сообщение об ошибке:

curl.exe -X PUT -T .\arckep2.jpg -H "Content-Type: image/jpeg"  -H "x-ms-date: $now" -H "x-ms-blo
b-type: BlockBlob" "http://127.0.0.1:10000/devstoreaccount1/profile-images/arckep3.jpg?sv=2018-03-28&sr=c&sig=2%2FKJVDhs2O5%2F5nAGpGzxRhnN4PE4AqPHOe3fFe7qC7o%3D&st=2019
-05-23T00%3A00%3A00Z&se=2019-05-25T00%3A00%3A00Z&sp=rwdl"

возвращает:

<?xml version="1.0" encoding="utf-8"?><Error><Code>AuthenticationFailed</Code><Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:d1313189-cde5-463d-8476-1aab15a9f03d
Time:2019-05-24T09:20:16.1975584Z</Message><AuthenticationErrorDetail>Signature did not match. String to sign used was rwdl
2019-05-23T00:00:00Z
2019-05-25T00:00:00Z
/blob/devstoreaccount1/profile-images



2018-03-28




</AuthenticationErrorDetail></Error>

Что с этим не так?

Я пытался реплицировать azure-sdk-for-js в коде: https://codepen.io/nagyv/pen/MdVpgX

const secret = "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=="  // Secret for every Azure storage emulator

function getParts() {
  return [
    "rwdl",
    "2019-05-23T00:00:00Z",
    "2019-05-25T00:00:00Z",
    "/blob/devstoreaccount1/profile-images",
    "",
    "",
    "",
    "2018-03-28",
    "",
    "",
    "",
    "",
    ""
  ].join("\n")
}
const parts = getParts()

function sign(message) {
  const crypted = CryptoJS.HmacSHA256(message, secret);
  return CryptoJS.enc.Base64.stringify(crypted)
}

const content = document.getElementById('content')
content.innerHTML = encodeURIComponent(sign(parts))

Context

Я хотел бы использовать онлайновый серверный бэкэнд на основе javascript (GameSparks) для генерацииSAS для моего браузера.К сожалению, учитывая бэкэнд, я не могу использовать SDK Azure для создания SAS.Поскольку SAS кажется простым токеном, я бы хотел сгенерировать его «вручную».

1 Ответ

0 голосов
/ 24 мая 2019

После некоторого хруста я понял, что проблема в том, что секретный код расшифровывается в base64 в случае решения Azure.

Это показывает, как получить тот же самый дайджест: https://stackoverflow.com/a/56295850/245493

Это меняется на

function sign(message) {
  const crypted = CryptoJS.HmacSHA256(message, CryptoJS.enc.Base64.parse(secret))
  return CryptoJS.enc.Base64.stringify(crypted)
}

решает мой вопрос.

...