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

如何对Azurite REST API表存储身份验证?请求遇未授权错误

Azurite Table Storage 请求未授权问题排查与解决

核心结论

端口修改不会影响SharedKey签名逻辑,签名仅基于账户名、密钥、请求方法、日期、规范资源路径生成。你的问题大概率出在请求头一致性、Cypress头传递或签名细节上,以下是具体排查步骤:


排查与修复步骤

1. 严格保证Date头与签名生成的日期完全一致

签名生成时的date值必须和请求头里的Date一字不差,包括时区、格式、空格。哪怕几秒的偏差或格式修改都会导致签名失效。

  • 验证方式:运行Node脚本后,直接复制输出的Date值粘贴到Postman的Date头中,搭配生成的Authorization头测试。如果Postman能成功请求,说明签名逻辑正确,问题出在Cypress的请求头传递环节。

2. 确认规范资源路径完全匹配请求URL

Table Storage的规范资源格式为/${accountName}/${tableName},需和请求URL的路径部分完全对应:

  • 你的请求URL路径是/devstoreaccount1/AuditLogs,脚本里的/${accountName}/${tableName}完全正确。如果后续请求带查询参数(如?$select=Id),规范资源需要追加这些参数(例:/${accountName}/${tableName}?$select=Id)。

3. 修正Cypress请求的头传递逻辑

Cypress可能默认添加或修改请求头,需手动指定所有必要头:

示例Cypress请求代码

// 通过Cypress任务调用Node逻辑生成签名
cy.task('generateAzuriteAuth', { tableName: 'AuditLogs' }).then((headers) => {
  cy.request({
    method: 'GET',
    url: 'http://localhost:10012/devstoreaccount1/AuditLogs',
    headers: {
      'Date': headers.date,
      'x-ms-version': '2025-01-05',
      'Authorization': headers.auth,
      'Accept': 'application/json;odata=nometadata'
    }
  }).then(res => {
    expect(res.status).to.eq(200);
  });
});

对应的Cypress任务配置(cypress.config.js)

const { defineConfig } = require('cypress');
const crypto = require('crypto');

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on) {
      on('task', {
        generateAzuriteAuth({ tableName }) {
          const accountName = 'devstoreaccount1';
          const accountKey = 'Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==';
          const date = new Date().toUTCString();
          const canonicalizedResource = `/${accountName}/${tableName}`;
          const stringToSign = `GET\n\n\n${date}\n${canonicalizedResource}`;
          
          const key = Buffer.from(accountKey, 'base64');
          const hmac = crypto.createHmac('sha256', key);
          hmac.update(stringToSign);
          const signature = hmac.digest('base64');
          
          return {
            date,
            auth: `SharedKey ${accountName}:${signature}`
          };
        }
      });
    },
  },
});

4. 验证Azurite运行端口

确保Azurite确实在10012端口提供Table服务,启动命令需指定端口:

azurite --tablePort 10012

查看启动日志确认端口配置无误。

5. 核对签名生成的字符串格式

确认stringToSign完全符合Table Storage要求,格式为:

GET


[Date头值]
[规范资源路径]

你的脚本生成格式正确,可打印stringToSign核对,示例如下:

GET


Mon, 10 Mar 2025 09:49:14 GMT
/devstoreaccount1/AuditLogs

内容的提问来源于stack exchange,提问作者Sora Teichman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:47:03