在使用手动sas键生成的javascript(typescript(文件中使用forge javaScript库中的连接字符串在Azure-iot-hub中遇到401,在Azure-iot-Hub中超过401。
连接字符串外观如下:HostName={resourceUri};SharedAccessKeyName={policyName};SharedAccessKey={key}"
i将字符串分解为字典,我自己计算到有效期的时间(添加3600秒(,然后继续使用以下功能计算SAS密钥URL参数:
// MSDN recommendation
const encodeUriComponentStrict = (str) => {
return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
return '%' + c.charCodeAt(0).toString(16);
});
}
function hmacHash(password, signingString) {
const hmac = forge.hmac.create();
console.log(`password`, password);
hmac.start('sha256', forge.util.encode64(password));
hmac.update(signingString);
const digested = hmac.digest();
return forge.util.encode64(digested.data);
}
/**
* Creates a Sas key for an azure iot registry
* @param hostName the azure iot resource uri
* @param policy the shared access key name
* @param key the shared access key
* @param expiry int64 representation of expiration time
*/
const createSasKeyForRegistry = (hostName: string, policy: string,
key: string, expiry: number) => {
let sas : any = {
_key: key,
sr: hostName,
se: expiry,
skn: encodeUriComponentStrict(policy),
};
sas.sig = encodeUriComponentStrict(hmacHash(sas._key, stringToSign(sas.sr, sas.se)));
return sas;
}
这是一个示例资源PUT
IoT设备端点,我可以在控制台中看到: https://{my-resource-uri}.net/devices/807417987db61b41ZX1F239P3Q?api-version=2016-11-14
我可以看到Authorization
标头以通常的SAS密钥格式附加:
"SharedAccessSignature sr={resource-uri}&sig=koNqIJF56tzzBpqWYp4tRvxeWIJEHSLugA2O2weELZ4%3D&se=1492307707&skn=iothubowner"
。
尽管如此,我仍然得到401 ...现在已经呆了几个小时了,尝试了各种事情而没有任何成功。想知道它是否与HMAC加密功能有关?有任何可以验证代码的伪造人员吗?对于有兴趣的人,我在离子2应用程序中(基于Angular 2(,并使用Angular 2的HTTP类执行请求。
谢谢。
,由于我现在没有50个声誉,所以我无法将其发布为评论。
您是否用base64解码了共享acceskekey?
我不熟悉Forge,但这是我对Cryptojs所做的
https://github.com/azure-iothub/device-management/blob/master/main.js#l117
使用getInfromConnectionsTring方法从连接字符串获得连接Info
https://github.com/azure-iothub/device-management/blob/master/main.js#l74
我希望这可以有所帮助。