2016-04-07 5 views
0

Ich habe ein Problem, wenn ich SAS-Tokens für die Verbindung mit IoT Hub verwende. Im Beispiel von Microsoft gibt es einen Beispielcode für NodeJS, um ein SAS-Token mit Krypto zu erstellen. Wenn ich diesen Code jedoch in NodeJS verwende, wird der Fehler this ausgegeben.IoT Hub SAS-Token Knoten JS Crypto-Fehler

Allerdings habe ich alles im Tutorial gemacht und ich kann nichts fehlen sehen. Der Beispielcode ist die folgende:

// 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; 
}; 

Ich hoffe, dass jemand mir mit diesem Geheimnis haha ​​helfen kann ..

Antwort

0

Der Fehler, der in Ihrem Screenshot zeigt zeigt an, dass ein Teil der gemeinsamen Zugriffs Unterschrift fehlt oder kann nicht analysiert werden.

es gibt ein paar Dinge, die ich in Ihrem Code sehen:

  1. wenn die Zeichenfolge verketten das Token zu erstellen gibt es eine *, die ein +

  2. die Art und Weise Sie die hmac erzeugen sollte hash: Wir verwenden 'toString (' binary ') nicht im base64-codierten Puffer, der das Passwort enthält (sollte kein Problem mit dem Knoten sein, wird ein Problem, wenn Sie versuchen, browserify zu verwenden):

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

(Referenz: authorization.js)

Aus dem Screenshot des Fehlers sieht es aus wie Sie bereits die node.js SDK verwenden, haben Sie versucht, die SharedAccessSignature.create(...) Verfahren entweder die Device SDK oder die Service SDK mit (je nachdem, was Sie versuchen)

zu erreichen, ist es, den Code ersetzen würde Sie gepostet von:?

// 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()); 
+0

+ auf Verkettung der Trick, danke sehr viel! –