2015-05-15 7 views
33

मैं एक Webhook for GitHub कोडिंग कर रहा हूँ, और जैसा कि KOA.js में सुरक्षित सत्यापन कार्यान्वित: pull_requests के लिएGithub धक्का घटना हस्ताक्षर से मेल नहीं

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

... 

और घटनाओं बनाने यह ठीक है, नई शाखाएं भी धक्का काम करता है काम करता है, लेकिन धक्का के लिए घटनाओं को x-hub-signature करता है और पेलोड से गणना हुई हैश मेल नहीं खाता है, इसलिए यह हमेशा 403 अनधिकृत हो जाता है।

अद्यतन

मैंने देखा है कि और धक्का पेलोड करता इस तरह के लिए head_commit पेलोड से जुड़ जाते हैं। मैंने शरीर से काम और head_commit को हटाने की कोशिश की है, लेकिन यह काम नहीं किया।

अद्यतन

अधिक जानकारी के लिए इन उदाहरण पेलोड की समीक्षा करें। मैंने परीक्षण रेपो और टोकन जानकारी के लिए यूआरएल भी शामिल किया है: https://gist.github.com/marcoslhc/ec581f1a5ccdd80f8b33

+0

"बुरी तरह विफलता" का क्या अर्थ है? आपको क्या त्रुटि मिलती है? – Chris

+0

'एक्स-हब-हस्ताक्षर' गणना की हैश के बराबर नहीं है। – marcoslhc

+2

अंधेरे में कुल स्टैब, लेकिन क्या आप सुनिश्चित हैं कि 'this.request.body' पहले से ही एक स्ट्रिंग नहीं है? यदि ऐसा है, तो यह डबल-एन्कोड किया जाएगा (उदाहरण के लिए, तीन-वर्ण स्ट्रिंग 'foo' JSON को पांच-वर्ण स्ट्रिंग '" foo "' में एन्कोड किया जाएगा। देखें कि 'type.request.body' किस प्रकार का उत्पादन करता है। – apsillers

उत्तर

10

default encoding of Crypto hash.update() is binaryNode JS crypto, cannot create hmac on chars with accents के उत्तर में विस्तृत के रूप में। यह आपके धक्का घटना पेलोड है, जो चरित्र Hernández चार बार में तीव्र साथ U+00E1लैटिन छोटे अक्षर एक होता है में एक समस्या का कारण बनता है, और GitHub सेवाओं इनकोडिंग utf-8 के रूप में पेलोड hashing है। ध्यान दें कि आपकी जिस्ट आईएसओ -885 9 -1 में गलत तरीके से एन्कोडेड दिखाती है, इसलिए यह भी सुनिश्चित करें कि आप आने वाले अनुरोध चरित्र-एन्कोडिंग को सही तरीके से प्रबंधित कर रहे हैं (लेकिन यह डिफ़ॉल्ट रूप से होना चाहिए)।

इस आप या तो एक Buffer उपयोग करने की आवश्यकता को ठीक करने के लिए:

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

... या update के लिए सीधे एन्कोडिंग पारित:

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

7f9e6014b7bddf5533494eff6a2c71c4ec7c042d का सही हैश तो गणना की जाएगी।

+1

ठीक है। कोशिश करने के लिए जा रहा है :) अब सही समझ में आता है! – marcoslhc

संबंधित मुद्दे