0

使用 SAS 令牌连接 IoT 中心时遇到问题。在 Microsoft 的示例中,NodeJS 有一个示例代码,用于创建带有加密的 SAS 令牌。但是,当我在 NodeJS 中使用此代码时,它会引发 错误。

但是,我在教程中做了所有事情,我看不到任何遗漏。示例代码如下:

// Creating SAS token
var crypto = require('crypto');

var generateSasToken = function (resourceUri, signingKey, policyName, expiresInMins) {
    resourceUri = encodeURIComponent(resourceUri.toLowerCase()).toLowerCase();

    // Set expiration in seconds
    var expires = (Date.now() / 1000) + expiresInMins * 60;
    expires = Math.ceil(expires);
    var toSign = resourceUri + '\n' + expires;

    // using crypto
    var decodedPassword = new Buffer(signingKey, 'base64').toString('binary');
    const hmac = crypto.createHmac('sha256', decodedPassword);
    hmac.update(toSign);
    var base64signature = hmac.digest('base64');
    var base64UriEncoded = encodeURIComponent(base64signature);

    // construct autorization string
    var token = "SharedAccessSignature sr=" + resourceUri + "&sig=" 
    * base64UriEncoded + "&se=" + expires;
    if (policyName) token += "&skn=" + policyName;
     console.log("signature:" + token);
    return token;
};

我希望有人能帮我解开这个谜哈哈..

4

1 回答 1

0

屏幕截图中显示的错误表明共享访问签名的一部分丢失或无法解析。

我可以在您的代码中看到几件事:

  1. 连接字符串以创建令牌时,有一个*应该是+

  2. 生成 hmac 哈希的方式:我们不在包含密码的 base64 编码缓冲区上使用 'toString('binary') ):

function hmacHash(password, stringToSign) {
  var hmac = crypto.createHmac('sha256', new Buffer(password, 'base64'));
  hmac.update(stringToSign);
  return hmac.digest('base64');
}

(参考:authorization.js

从错误的屏幕截图来看,您似乎已经在使用 node.js SDK,您是否尝试过使用设备 SDK服务 SDKSharedAccessSignature.create(...)的方法(取决于您要实现的目标?)

它将替换您发布的代码:

// compute expiry value
var expires = (Date.now() / 1000) + expiresInMins * 60;
expires = Math.ceil(expires);
// generate SAS token
var sas = SharedAccessSignature.create(resourceUri, policyName, signingKey, expires);
// from then you can create a client object:
var client = Client.fromSharedAccessSignature(sas.toString());
于 2016-04-08T17:42:07.363 回答