如何使用 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)
我正在尝试使用本文档中提供的 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)