如何在Bash中通过REST API删除Azure存储队列消息(解决认证失败)
解决Bash调用Azure Storage Queue REST API删除消息的认证失败问题
从你提供的错误信息能看到,服务器用来签名的字符串里,资源路径是/gildedhonordev/ghmatchedtickets/messages/<messageid>,但你的代码里URL_RESOURCE把?popreceipt=$POP_RECEIPT也加进去了——Azure的SharedKey签名规则里,查询参数不需要包含在签名的资源路径中,这就是认证失败的核心原因。
修正后的delete_queued_message函数如下:
delete_queued_message() { DATE_ISO=$(TZ=GMT date "+%a, %d %h %Y %H:%M:%S %Z") VERSION="2016-05-31" HEADER_RESOURCE="x-ms-date:$DATE_ISO\nx-ms-version:$VERSION" # 签名用的资源路径仅到messageid,移除查询参数部分 URL_RESOURCE="/$STORAGE_ACC/$QUEUE_NAME/messages/$MESSAGE_ID" STRING_TO_SIGN="DELETE\n\n\n\n\n\n\n\n\n\n\n\n$HEADER_RESOURCE\n$URL_RESOURCE" DECODED_KEY="$(echo -n "$STORAGE_KEY" | base64 -d -w0 | xxd -p -c256)" SIGN=$(printf "$STRING_TO_SIGN" | openssl dgst -sha256 -mac HMAC -macopt "hexkey:$DECODED_KEY" -binary | base64 -w0) # curl请求的URL仍需保留popreceipt参数(接口必填),仅签名时不包含即可 curl -X DELETE \ -H "x-ms-date:$DATE_ISO" \ -H "x-ms-version:$VERSION" \ -H "Authorization: SharedKey $STORAGE_ACC:$SIGN" \ "https://$STORAGE_ACC.queue.core.windows.net/$QUEUE_NAME/messages/$MESSAGE_ID?popreceipt=$POP_RECEIPT" }
补充说明:
- 核心修改点:
URL_RESOURCE移除了?popreceipt=$POP_RECEIPT,让签名用的资源路径与服务器预期完全匹配 - 注意:
popreceipt是删除消息的必填参数,必须保留在curl请求的URL中,只是不需要加入签名的待计算字符串 - 请确保
MESSAGE_ID和POP_RECEIPT是从get_queued_message函数正确获取的有效值,未出现空值或篡改
内容的提问来源于stack exchange,提问作者Xynanxdb
相关产品推荐
相关产品推荐

