और तलाश के लिए धन्यवाद।

मैं AWS प्रमाणीकरण हेडर बनाने के लिए अपने स्वयं के हल्के PHP वर्ग को लिखने की कोशिश कर रहा हूं। मैं जो बता सकता हूं वह सही ढंग से काम कर रहा है। मैंने यहाँ AWS प्रलेखन में दिए गए उदाहरणों के साथ इसका परीक्षण किया है: http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html

और मेरा कोड प्रत्येक उदाहरण के लिए दिए गए आउटपुट का बिल्कुल उत्पादन करता है, इसलिए मुझे पूरा विश्वास है कि हस्ताक्षर पीढ़ी सही है।

मैंने AWS PHP SDK के साथ कुंजी और रहस्य का भी परीक्षण किया है और यह साबित किया है कि यह इस कोड के साथ काम करता है: (चाबियाँ स्पष्ट रूप से obfusated :))

require 'vendor/autoload.php';
use Aws\S3\S3Client;

$client = S3Client::factory(array(
   'key' => 'xxxxxxxxxxxxxxxxxxxx',
   'secret' => 'ssssssssssssssssssssssssssssssssssssssss',
   'scheme' => 'http'
));

$result = $client->listBuckets();

foreach ($result['Buckets'] as $bucket) {
    // Each Bucket value will contain a Name and CreationDate
    echo "{$bucket['Name']} - {$bucket['CreationDate']}\n";
}

(बस परीक्षण इतनी कुंजी कोड में लिखा है जो मुझे पता है कि सबसे अच्छा अभ्यास सही नहीं है :), और HTTP पर स्विच किया गया ताकि मैं वायरशार्क के साथ आउटपुट का निरीक्षण कर सकूं)

वायरशर्क आउटपुट से पता चला कि SDK से शामिल हेडर उन दस्तावेज़ों से मेल नहीं खाते हैं जो मैंने पहले लिंक किए हैं, जो दस्तावेज़ में दिए गए हैं! लगता है कि AWS डॉक्स साइट पर बहुत सारे परस्पर विरोधी दस्तावेज हैं।

जैसा कि मेरे हस्ताक्षर पीढ़ी कोड उदाहरणों से मेल खाते हैं, मुझे संदेह है कि अनुरोध भेजने के लिए कर्ल का उपयोग करते समय शायद मेरे पास कुछ गलत है? मैंने POST और GET को उन तरीकों के रूप में आज़माया है जिनके जवाब में कोई अंतर नहीं है। त्रुटि संदेश और हस्ताक्षर संबंधी अनुरोध में हस्ताक्षर करने के लिए स्ट्रिंग दोनों हस्ताक्षरित कार्यों द्वारा उत्पादित उन से मेल खाते हैं।

मेरा कोड स्निपेट है:

printf("URL: $e\n");
if ($ch = curl_init("http://s3-eu-west-1.amazonaws.com".$e)){ // Create curl request object

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $curlHeaders = array();
    foreach ($awsobj->headers as $key => $val){
        $curlHeaders[] = $key.': '.$val;
    }
    $curlHeaders[] = 'Authorization: '.$ah['Authorization'];

    curl_setopt($ch, CURLOPT_HTTPHEADER, $curlHeaders);

    printf("CREQ:\n%s\n---", $awsobj->getCREQ());
    printf("STS:\n%s\n---", $awsobj->getSTS());

    $res = curl_exec($ch);

    var_dump($res);
}

इसके विरुद्ध कॉल करने वाला URL है: http: // s3-eu -west-1.amazonaws.com/?LocationConstraint=eu-west-1

स्ट्रिंग के साथ साइन इन करें:

AWS4-HMAC-SHA256
Sun, 29 Nov 2015 10:57:02 +0000
20151129/eu-west-1/s3/aws4_request
2b1435293edc751d0d80efc9016433a2635de23bc8c0d2e97d3a54c0cfadd74b

का अनुरोध:

GET
/
LocationConstraint=eu-west-1
date:Sun, 29 Nov 2015 10:57:02 +0000
host:s3-eu-west-1.amazonaws.com
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

date;host;x-amz-content-sha256
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

(इन के अंत में कोई वापसी नहीं है)

एस 3 से प्रतिक्रिया है:

<Error><Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>   

<StringToSign>AWS4-HMAC-SHA256
Sun, 29 Nov 2015 10:57:02 +0000
20151129/eu-west-1/s3/aws4_request
2b1435293edc751d0d80efc9016433a2635de23bc8c0d2e97d3a54c0cfadd74b</StringToSign>
<StringToSignBytes>41 57 53 34 2d 48 4d 41 43 2d 53 48 41 32 35 36 0a 53 75 6e 2c 20 32 39 20 4e 6f 76 20 32 30 31 35 20 31 30 3a 35 37 3a 30 32 20 2b 30 30 30 30 0a 32 30 31 35 31 31 32 39 2f 65 75 2d 77 65 73 74 2d 31 2f 73 33 2f 61 77 73 34 5f 72 65 71 75 65 73 74 0a 32 62 31 34 33 35 32 39 33 65 64 63 37 35 31 64 30 64 38 30 65 66 63 39 30 31 36 34 33 33 61 32 36 33 35 64 65 32 33 62 63 38 63 30 64 32 65 39 37 64 33 61 35 34 63 30 63 66 61 64 64 37 34 62</StringToSignBytes>
<CanonicalRequest>GET
/
LocationConstraint=eu-west-1
date:Sun, 29 Nov 2015 10:57:02 +0000
host:s3-eu-west-1.amazonaws.com
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

date;host;x-amz-content-sha256
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855</CanonicalRequest>
<CanonicalRequestBytes>47 45 54 0a 2f 0a 4c 6f 63 61 74 69 6f 6e 43 6f 6e 73 74 72 61 69 6e 74 3d 65 75 2d 77 65 73 74 2d 31 0a 64 61 74 65 3a 53 75 6e 2c 20 32 39 20 4e 6f 76 20 32 30 31 35 20 31 30 3a 35 37 3a 30 32 20 2b 30 30 30 30 0a 68 6f 73 74 3a 73 33 2d 65 75 2d 77 65 73 74 2d 31 2e 61 6d 61 7a 6f 6e 61 77 73 2e 63 6f 6d 0a 78 2d 61 6d 7a 2d 63 6f 6e 74 65 6e 74 2d 73 68 61 32 35 36 3a 65 33 62 30 63 34 34 32 39 38 66 63 31 63 31 34 39 61 66 62 66 34 63 38 39 39 36 66 62 39 32 34 32 37 61 65 34 31 65 34 36 34 39 62 39 33 34 63 61 34 39 35 39 39 31 62 37 38 35 32 62 38 35 35 0a 0a 64 61 74 65 3b 68 6f 73 74 3b 78 2d 61 6d 7a 2d 63 6f 6e 74 65 6e 74 2d 73 68 61 32 35 36 0a 65 33 62 30 63 34 34 32 39 38 66 63 31 63 31 34 39 61 66 62 66 34 63 38 39 39 36 66 62 39 32 34 32 37 61 65 34 31 65 34 36 34 39 62 39 33 34 63 61 34 39 35 39 39 31 62 37 38 35 32 62 38 35 35</CanonicalRequestBytes>
<RequestId>6C049EA89D65D27E</RequestId>
<HostId>HSGO1Iz6LIT5jkHHGM/XCI0ElnSDiQseb1CUcg4RxXjb+xplWoVCFbgJoT6CPvpCsoOSIS7m7VI=</HostId>

(पहुंच कुंजी की छंटनी)

मैंने पिछले कुछ दिनों को गुगली और अपने कोड को ट्विक करने में बिताया है। मैं हस्ताक्षर की पीढ़ी के साथ कुछ भी गलत नहीं कर सकता, क्योंकि आप मेरे द्वारा निर्मित एसटीएस और सीआरक्यू दोनों को एस 3 द्वारा निर्मित मैच देख सकते हैं। मेरा कोड ऑथेंटिकेशन हेडर क्रेडेंशियल्स सहित उपरोक्त लिंक के सभी उदाहरणों से गुजरता है और मेल खाता है।

मुझे शक है कि मैं हूं

  • या तो कुछ याद आ रहा है जो S3 मुझे शामिल करना चाहता है (हेडर की आवश्यकता है, मैंने इन के लिए खोज की है, लेकिन कोई नहीं मिला है, आउटपुट लोकेशनकॉन्स्ट्रिंट के साथ या इसके बिना समान है, और यह भी कि अगर हम इसे पूर्व-1 पर इंगित करते हैं)।
  • मैंगलिंग कर्ल कुछ कैसे
  • प्रमाणीकरण हेडर के गलत प्रकार का उपयोग करते हुए (जैसा कि मैंने कहा कि एसडीके द्वारा उत्पन्न अनुरोध पूरी तरह से अलग दिखता है, लेकिन डॉक्स के लिए जो आवश्यक है, उसका पालन नहीं करता है)।

रिदमिक फ़िस्टमैन के सुझाव के अनुसार मैंने एक्स-एमेज़-डेट हेडर के साथ दिनांक हेडर को बदलने का भी प्रयास किया है, लेकिन इससे समस्या हल नहीं हुई। मेरे नए हेडर का प्रारूप था:

x-amz-date:20151130T143334Z

14:33 पर 30 वीं नवबंर 2015 को बनाया गया

धन्यवाद

3
Graeme 29 नवम्बर 2015, 14:23

2 जवाब

सबसे बढ़िया उत्तर

मैंने अपनी त्रुटि देखी है: / यह कर्ल के साथ नहीं है, लेकिन यह करने के लिए कि मैंने हस्ताक्षर कैसे किए।

मैं प्रक्रिया के प्रत्येक चरण में आउटपुट का परीक्षण करने और अमेज़ॅन के उदाहरणों द्वारा दिए गए परिणामों के साथ तुलना करके अपने कोड का परीक्षण कर रहा हूं। ये सब बीत गया और इसलिए मैं निश्चित था कि मेरा कोड सही था।

हालाँकि, स्ट्रिंग टू साइन की पीढ़ी को कैननिकल अनुरोध के हैश की आवश्यकता होती है। मेरे कोड में मेरे पास एक फ़ंक्शन है जो कैनोनिकल अनुरोध को उत्पन्न करता है और इसे आउटपुट करता है, लेकिन यह इसका एक हैश भी उत्पन्न करता है और इसे ऑब्जेक्ट में सार्वजनिक चर में संग्रहीत करता है। जनरेटिंग फंक्शन साइन करने के लिए मेरा स्ट्रिंग साइन करने के लिए स्ट्रिंग की पीढ़ी में इस चर का उपयोग करता है।

अब जैसा कि मेरे परीक्षण कोड को विहित अनुरोध कहा जाता है, परीक्षण किया गया कि यह आउटपुट वैध था, फिर हस्ताक्षर करने के लिए स्ट्रिंग को बुलाया और परीक्षण किया कि यह परिणाम वैध है, यह अनजाने में हैश पैदा होने का कारण था।

एपीआई को कॉल करने वाले मेरे वास्तविक कोड में, वास्तविक विहित अनुरोध को आउटपुट करने की आवश्यकता नहीं थी, इसलिए हैश कभी नहीं बनाया गया था और हस्ताक्षर करने के लिए स्ट्रिंग अमान्य था। हस्ताक्षर उत्पन्न होने के बाद समस्या के निदान के प्रयास में मैंने जो आउटपुट जोड़ा, वह कोड के अंत में जोड़ा गया।

अपनी गलती का अहसास होने पर, मैंने हस्ताक्षर करने के लिए कॉल करने से पहले विहित अनुरोध को आउटपुट करने के लिए कॉल को स्थानांतरित कर दिया है और यह काम करता है!

आह!

यहाँ अपने तरीकों की त्रुटि को समझाने के लिए सबसे अच्छा लगा, मैं मानता हूँ कि यह मेरी अपनी गलती है, और यह कि अगर कोड लिखना किसी प्रक्रिया के चरणों को देखने में सक्षम हो, तो सुनिश्चित करें कि वे उन चरणों, या एक्सपोज़र विधियों पर निर्भर नहीं हैं सही ढंग से कार्य करने के लिए कहा जाता है।

2
Graeme 30 नवम्बर 2015, 17:34

मुझ पर दो बातें छपीं:

  1. आप x-amz-date हेडर नहीं जोड़ रहे हैं
  2. हस्ताक्षर करने के लिए आपके स्ट्रिंग में दिनांक स्वरूप गलत दिखता है। यह ISO-8601 (उदाहरण के लिए 20130524T000000Z) होना चाहिए

उदाहरण के लिए यहां गणना करें एक > । सुनिश्चित करें कि आपका कार्यान्वयन आपके परीक्षण में इसके आउटपुट से मेल खाता है!

0
Rhythmic Fistman 30 नवम्बर 2015, 00:31