2015-05-15 5 views
33

Ich bin Codierung eine Webhook for GitHub und implementiert eine sichere Überprüfung in KOA.js als:Github Push Ereignissignatur nicht übereinstimmen

function sign(tok, blob) { 
    var hmac; 

    hmac = crypto 
    .createHmac('sha1', tok) 
    .update(blob) 
    .digest('hex'); 

    return 'sha1=' + hmac; 
} 

... 

key = this.request.headers['x-hub-signature']; 
blob = JSON.stringify(this.request.body); 

if (!key || !blob) { 
    this.status = 400; 
    this.body = 'Bad Request'; 
} 

lock = sign(settings.api_secret, blob); 

if (lock !== key) { 
    console.log(symbols.warning, 'Unauthorized'); 
    this.status = 403; 
    this.body = 'Unauthorized'; 
    return; 
} 

... 

für pull_requests und schaffen Ereignisse dies funktioniert ok, auch drängen neue Filialen arbeitet, aber für Push-Commits Ereignisse die x-hub-signature und der berechnete Hash aus der Nutzlast nicht übereinstimmen, so wird es immer 403 nicht autorisiert.

aktualisiert

Ich habe für diese Art von Push-Nutzlasten der Commits und head_commit zugesetzt werden, um die Nutzlast bemerkt. Ich habe versucht, die commits und die head_commit aus dem Körper zu entfernen, aber es hat nicht funktioniert.

aktualisieren

Weitere Informationen finden Sie diese zB Nutzlasten überprüfen. Ich habe auch URL für die Test-Repo-und Token-Info enthalten: https://gist.github.com/marcoslhc/ec581f1a5ccdd80f8b33

+0

Was bedeutet "kläglich"? Welche Fehler bekommen Sie? – Chris

+0

Die 'x-Hub-Signatur' ist nicht gleich dem berechneten Hash. – marcoslhc

+2

Ein totaler Stich im Dunkeln, aber bist du dir sicher, dass "this.request.body" nicht schon eine Zeichenfolge ist? Wenn dies der Fall ist, wird es doppelt codiert (z. B. wird die aus drei Zeichen bestehende Zeichenfolge "foo" JSON-codiert in die aus fünf Zeichen bestehende Zeichenfolge "foo"). Sehen Sie, was 'typeof.request.body' erzeugt. – apsillers

Antwort

10

Die default encoding of Crypto hash.update() is binary wie in der Antwort auf Node JS crypto, cannot create hmac on chars with accents beschrieben. Dies führt zu einem Problem in der Push-Ereignis-Nutzlast, das vier Mal das Zeichen enthält, und die GitHub-Dienste hashen die Nutzdaten als utf-8 codiert. Beachten Sie, dass Ihr Gist diese in ISO-8859-1 falsch codiert anzeigt. Stellen Sie daher sicher, dass Sie die Zeichencodierung für eingehende Anfragen korrekt verarbeiten (dies sollte jedoch standardmäßig geschehen).

dies beheben Sie entweder eine Buffer verwenden müssen:

hmac = crypto.createHmac('sha1', tok).update(new Buffer(blob, 'utf-8')).digest('hex'); 

... oder übergeben Sie die Codierung direkt an update:

hmac = crypto.createHmac('sha1', tok).update(blob, 'utf-8').digest('hex'); 

Die richtige Hash 7f9e6014b7bddf5533494eff6a2c71c4ec7c042d wird dann berechnet werden.

+1

Ok. Going to try :) Macht jetzt vollkommen Sinn! – marcoslhc