gpt4 book ai didi

node.js - Azure 表存储查询失败,Windows 应用商店应用程序中出现 AuthenticationFailed 错误

转载 作者:行者123 更新时间:2023-12-03 06:04:03 25 4
gpt4 key购买 nike

azure 表查询 REST API 失败,出现 AuthenticationFailed 错误。

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<code>AuthenticationFailed</code>
<message xml:lang="en-US">Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.</message>
</error>

用于形成并进行其余调用的 winjs 应用程序代码片段是:

var date = new Date().toGMTString().replace('UTC', 'GMT');
var xhrOption = {
type: 'GET',
url: url,
headers: {
'content-type': 'application/atom+xml;charset="utf-8"',
'content-length': 0,
dataserviceversion: '1.0;NetFx',
maxdataserviceversion: '2.0;NetFx',
'x-ms-version': '2011-08-18',
'x-ms-date': date,
accept: 'application/atom+xml,application/xml',
'Accept-Charset': 'UTF-8',
},
};

xhrOption.headers.Authorization = AuthorizationHeader().computeForTableService(options, xhrOption);

计算授权 header 的代码有点长。具体如下:

_getSignatureStringForTableService: function getSignatureStringForTableService()
{
var headers = this.xhrOptions.headers;
var httpVerb = this.xhrOptions.type.toUpperCase();
var sigItems = [];
sigItems.push(httpVerb);
var contentMD5 = this._getHeaderOrDefault(headers, 'Content-MD5');
sigItems.push(contentMD5);
var contentType = this._getHeaderOrDefault(headers, 'content-type');
sigItems.push(contentType);
var date = this._getHeaderOrDefault(headers, 'x-ms-date');
if (!date)
date = this._getHeaderOrDefault(headers, 'Date');
sigItems.push(date);
var canonicalizedResource = this._getCanonicalizedResource();
sigItems.push(canonicalizedResource);
var result = sigItems.join('\n');
return result;
},
_getCanonicalizedResource: function getCanonicalizedResource()
{
var items = [];
var path;
if (config.storageAccount.isDevStorage)
path = "/" + config.storageAccount.name + '/' + config.storageAccount.name;
else
path = "/" + config.storageAccount.name;

path += "/" + this.options.resourcePath;
items.push(path);
var result = items.join('\n');
return result;
},
computeForTableService: function computeForTableService(options, xhrOptions)
{
this.options = options;
this.xhrOptions = xhrOptions;
var sig = this._computeSignatureForTableService();
var result = 'SharedKey ' + config.storageAccount.name + ':' + sig;
return result;
},
_computeSignatureForTableService: function computeSignatureForTableService()
{
var sigString = this._getSignatureStringForTableService();

// TODO: use crypto from windows api. currently uses, google cryptoJS lib
var key = CryptoJS.enc.Base64.parse(config.storageAccount.primaryKey);
var hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);
hmac.update(sigString);
var hash = hmac.finalize();
var result = hash.toString(CryptoJS.enc.Base64);
return result;
},

有趣的是,我的整个代码在 2 天前运行良好。我已更新服务代码以使用更新的 azure nodejs sdk。我想知道更新是否导致发布者/消费者代码中出现一些不兼容?

其他观察结果

  1. 使用azure nodejs模块的服务代码,能够查询表存储而不会出错。
  2. 我通过 azure nodejs 模块进行了调试,查看了 stringToSign 并与 winjs 代码生成的内容进行了匹配。两者都是一样的。
  3. 服务已升级为使用 0.10.x Node 和相应的最新 azure nodejs sdk。
  4. 示例:stringToSign

    GET\n\napplication/atom+xml;charset="utf-8"\n2013 年 6 月 5 日星期三 14:43:30 GMT\n/devstoreaccount1/devstoreaccount1/mytable()

感谢您了解详细信息。

最佳答案

最终 - 该错误的根本原因已经解决。问题在于 x-ms-date header 的值。

预期值 - 2013 年 6 月 6 日星期四 08:09:50 GMT上述代码中计算的值 - Thu, 6 Jun 2013 08:20:34 GMT

日期之前缺失的0是此错误的根本原因。因此,用于计算授权 header 的 stringToSign 是不正确的。因此,授权 header 不正确,导致 AuthenticationFailed 错误。这也解释了该代码在几天前起作用的原因(五月底 - 日期有两位数)。

如果来自 MS 的人正在阅读本文,那么拥有正确数量的详细信息以及错误代码将会非常有用。 AuthenticationFailed 错误代码本身无法为开发人员提供任何线索。

我之前使用过azure storage blob Rest api。对于相同的 AuthenticationFailed 错误代码,它返回更好的错误。它发送 expected stringToSignfound stringToSign 以及 AuthenticationFailed 错误代码。它更有帮助,错误在几分钟内就得到解决。

二手Network monitor来自微软。编写了 C# 代码片段,使用 azure .net sdk 进行 azure 表查询,并逐字符比较每个 header 以解决问题。

关于node.js - Azure 表存储查询失败,Windows 应用商店应用程序中出现 AuthenticationFailed 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16943119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com