IoT 中心 SAS 令牌节点 JS 加密错误
IoT Hub SAS Tokens Node JS Crypto error
我在使用 SAS 令牌连接 IoT 中心时遇到问题。
在 Microsoft 的示例中,有一个示例代码供 NodeJS 使用加密创建 SAS 令牌。但是,当我在 NodeJS 中使用此代码时,它会抛出 this 错误。
然而,我已经完成了教程中的所有内容,我看不出有什么遗漏。
示例代码如下:
// 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;
};
希望有人能帮我解开这个谜哈哈..
您的屏幕截图中显示的错误表明共享访问签名的一部分丢失或无法解析。
我可以在你的代码中看到一些东西:
当连接字符串以创建令牌时,有一个 *
应该是 +
你生成 hmac 哈希的方式:我们不在包含密码的 base64 编码缓冲区上使用 'toString('binary')(不应该是节点的问题,如果您尝试使用 browserify 将是一个问题):
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,您是否尝试过使用 Device SDK or the Service SDK 的 SharedAccessSignature.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());
我在使用 SAS 令牌连接 IoT 中心时遇到问题。 在 Microsoft 的示例中,有一个示例代码供 NodeJS 使用加密创建 SAS 令牌。但是,当我在 NodeJS 中使用此代码时,它会抛出 this 错误。
然而,我已经完成了教程中的所有内容,我看不出有什么遗漏。 示例代码如下:
// 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;
};
希望有人能帮我解开这个谜哈哈..
您的屏幕截图中显示的错误表明共享访问签名的一部分丢失或无法解析。
我可以在你的代码中看到一些东西:
当连接字符串以创建令牌时,有一个
*
应该是+
你生成 hmac 哈希的方式:我们不在包含密码的 base64 编码缓冲区上使用 'toString('binary')(不应该是节点的问题,如果您尝试使用 browserify 将是一个问题):
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,您是否尝试过使用 Device SDK or the Service SDK 的 SharedAccessSignature.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());