You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 17:49:52