2015-05-15 12 views
33

che sto codifica di un Webhook for GitHub, e implementato verifica sicuro KOA.js come:Github firma evento spinta non corrispondono

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

... 

per pull_requests e creare eventi questo funziona bene, anche spingendo nuove filiali Works, ma per il push commette eventi, lo x-hub-signature e l'hash calcolato dal payload non corrispondono, quindi ottengono sempre 403 non autorizzati.

Aggiornamento

ho notato che per questo tipo di payload spingere le commette e head_commit sono aggiunti al carico utile. Ho provato a rimuovere commit e head_commit dal corpo ma non ha funzionato.

Aggiornamento

Per ulteriori informazioni si prega di consultare questi esempi carichi utili. Ho anche incluso URL per il repo di prova e le informazioni token: https://gist.github.com/marcoslhc/ec581f1a5ccdd80f8b33

+0

Che cosa significa "fallisce miseramente"? Che errore (i) ottieni? – Chris

+0

La 'x-hub-signature' non è uguale all'hash calcolato. – marcoslhc

+2

Una pugnalata totale al buio, ma sei sicuro che 'this.request.body' non sia già una stringa? Se lo è, sarà codificato a due (ad esempio, la stringa di tre caratteri 'foo' sarà codificata JSON nella stringa di cinque caratteri' "foo" '). Guarda cosa produce 'typeof this.request.body'. – apsillers

risposta

10

Il default encoding of Crypto hash.update() is binary come specificato nella risposta alla Node JS crypto, cannot create hmac on chars with accents. Ciò causa un problema nella vostra payload push-evento, che contiene il carattere U+00E1alfabeto latino con accento acuto in Hernández quattro volte, e servizi di GitHub è hashing il carico utile come utf-8 codificato. Nota che il tuo Gist mostra questi codificati in modo non corretto in ISO-8859-1, quindi assicurati anche di gestire correttamente la codifica dei caratteri della richiesta in arrivo (ma ciò dovrebbe avvenire per impostazione predefinita).

Per risolvere questo problema è necessario usare sia ad un Buffer:

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

... o passare la codifica direttamente a update:

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

saranno quindi calcolati e la correttezza hash di 7f9e6014b7bddf5533494eff6a2c71c4ec7c042d.

+1

Ok. Andare a provare :) Ha perfettamente senso ora! – marcoslhc

Problemi correlati