如何使用 SAS 对存储 Queue 的 Azure REST API 进行身份验证?

How to authenticate Azure REST APIs to Storage Queue with SAS?

我正在尝试使用本文档中提供的 REST API 向我的存储 Queue 添加一条消息: https://docs.microsoft.com/en-us/rest/api/storageservices/put-message

请注意,我不能使用 Azure 库来完成这项任务,我知道现在没有库可用于服务,我正在 Python 中设置测试触发器来模拟 REST API 将从 Service Now 进行的调用。 在所有情况下,我都会收到 403 错误代码,但在响应或响应的 header 中没有详细信息。

import os, requests, datetime
date = datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')

storage_account = "testacc"
queue = "test-queue"

msg = """<QueueMessage>  
<MessageText>Testing 123</MessageText>  
</QueueMessage>
"""

api = f"https://{storage_account}.queue.core.windows.net/{queue}/messages/?visibilitytimeout=30&timeout=30"
header = {
    "Authorization": f"SharedAccessSignature https://{storage_account}.queue.core.windows.net/?sv=2020-08-04&ss=q&srt=sco&sp=rwau&se=2022-03-03T17:52:52Z&st=2022-02-17T09:52:52Z&spr=https&sig=<REDACTED SIG>", 
    "Content-Type": "application/xml",
    "Content-Length": "str(len(msg))"
}

resp = requests.post(url=api, data=msg, headers=header)

print(resp.headers, resp.status_code)

我不确定如何为此 API 设计身份验证密钥,如有任何提示和建议,我们将不胜感激。谢谢。

您不必在请求中包含 Authorization header。只需使用您的 SAS URL 发送请求(与其他 header 一起),请求应该可以正常工作。

您不需要 Authorization header 的原因是授权信息已经包含在您的 SAS 令牌中(SAS 令牌的 sig 部分)。

你的代码应该是这样的:

api = f"https://{storage_account}.queue.core.windows.net/{queue}/messages/?visibilitytimeout=30&timeout=30&sv=2020-08-04&ss=q&srt=sco&sp=rwau&se=2022-03-03T17:52:52Z&st=2022-02-17T09:52:52Z&spr=https&sig=<REDACTED SIG>"
header = {
    "Content-Type": "application/xml",
    "Content-Length": "str(len(msg))"
}

resp = requests.post(url=api, data=msg, headers=header)

print(resp.headers, resp.status_code)