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

SIM868e通过AT指令请求Azure Cosmos DB返回401未授权报错

问题根因

返回401未授权是三类配置错误共同导致的:

  • 核心错误:Azure Cosmos DB REST API的Authorization字段不支持直接填入明文主密钥。你当前直接将只读主密钥作为sig参数值传递,完全不符合Cosmos DB的签名认证规则,Cosmos DB要求sig字段必须是按照固定规则生成的HMAC-SHA256签名值,而非原始密钥。
  • 次要错误:SIM868模块自定义请求头传递格式错误。你在AT+HTTPPARA="USERDATA"参数中直接使用裸换行分隔多个请求头,会导致AT指令解析中断,x-ms-version、x-ms-date两个头实际没有被模块附加到HTTP请求中,而这两个头是Cosmos DB认证的必选字段,缺失或格式错误都会直接触发认证失败。
  • 附加问题:你当前通过AT+HTTPPARA="CONTENT"设置的是请求体类型,GET请求无请求体时该参数不生效,你未设置Accept头指定响应格式,部分场景下也会触发请求异常。
修复步骤
  1. 按Cosmos DB规范生成合法Authorization签名
    签名生成逻辑固定,步骤如下:
    • 拼接待签名字符串,格式严格为:{HTTP请求方法小写}\n{资源类型}\n{资源链接}\n{x-ms-date头的值转小写}\n\n
      对应你本次请求的参数:
      • 请求方法:get
      • 资源类型:colls(对应列举集合的接口)
      • 资源链接:dbs/WM/colls(和URL中的路径完全一致,不能带前导/后缀斜杠)
      • x-ms-date:和你后续请求头中传递的GMT时间完全一致,时间误差不能超过15分钟
    • 先将你的Cosmos DB只读主密钥做base64解码得到原始二进制密钥,再对待签名字符串做HMAC-SHA256计算
    • 将计算得到的哈希结果做base64编码,再做URL编码,得到最终的sig参数值
    • 最终Authorization头格式为:type=master&ver=1.0&sig={上一步生成的编码后签名值}
      Arduino环境下可参考以下签名生成片段:
    // 示例代码,需根据你使用的加解密库调整参数
    String verb = "get";
    String resourceType = "colls";
    String resourceLink = "dbs/WM/colls";
    String xmsDate = "thu, 30 jun 2022 13:05:09 gmt"; // 必须和头里传的值完全一致,全小写
    String stringToSign = verb + "\n" + resourceType + "\n" + resourceLink + "\n" + xmsDate + "\n\n";
    // 先将主密钥base64解码为二进制
    uint8_t keyBin[32];
    base64decode(primaryReadOnlyKey, keyBin);
    // 计算HMAC-SHA256
    uint8_t hmacRes[32];
    hmac_sha256(keyBin, 32, (uint8_t*)stringToSign.c_str(), stringToSign.length(), hmacRes);
    // 结果base64+URL编码得到sig
    String sig = urlencode(base64encode(hmacRes, 32));
    String authHeader = "Authorization:type=master&ver=1.0&sig=" + sig;
    
  2. 修正SIM868模块的自定义请求头传递逻辑
    • 不要在AT指令参数中输入裸换行,多个请求头之间用\r\n转义序列分隔,确保所有头都在同一个USERDATA参数中被完整解析
    • 补充必选的Accept头,指定响应格式为application/json
      修正后的AT指令传参示例:
    AT+HTTPPARA="USERDATA","Authorization:type=master&ver=1.0&sig={你生成的正确签名}\r\nx-ms-version:2018-12-31\r\nx-ms-date:Thu, 30 Jun 2022 13:05:09 GMT\r\nAccept:application/json"
    
    如果你使用的SIM868固件版本不支持\r\n转义分隔多请求头,可逐次调用AT+HTTPPARA="USERDATA"追加单个请求头,每次仅传一个头字段,模块会自动将多段USERDATA拼接为完整的请求头集合。
  3. 验证修复效果
    重新执行HTTP GET请求,正常情况下会返回200状态码,响应体为WM数据库下的所有容器列表信息。如果仍返回401,优先检查:
    • 签名用的x-ms-date和请求头中传递的x-ms-date是否完全一致,时间是否为标准GMT格式
    • 待签名字符串的换行符是否为\n,是否多了或少了末尾空行
    • 资源类型、资源链接是否和请求URL完全匹配,大小写是否一致

内容的提问来源于stack exchange,提问作者Abu Saeed Mirza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:09:18