2017-09-20 72 views
0

我想從我的瀏覽器上傳一個文件到S3(Base64格式),但似乎我必須先得到一個簽名的URL,但我從來沒有得到嘗試獲取此簽名網址的正確迴應。下面是我做的:AWS S3:SignatureDoesNotMatch當試圖獲取簽名的URL做瀏覽器上傳

... 
const aws = require('aws-sdk') 

MyController.get('/s3_sign', (req, res) => { 

    let s3 = new aws.S3(); 
    aws.config.update({ 
    accessKeyId: "AKIAIWUTWWWBZM3IZNJAQ", 
    secretAccessKey: "My_Secret_Key_Without_Any_Special_Characther" 
    }); 

    let params = { 
    Bucket: 'my-bucket-name', 
    Key: 'file.jpg', 
    Expires: 300 
    }; 

    const url = s3.getSignedUrl('putObject', params, function(err, data){ 
    if (err) { 
     console.log("Error uploading data: ", err); 
     res.json({success: false}) 
    } else { 
     console.log("URL: ", data); 
     res.json({success: true, data: data}) 
    } 
    }); 

}) 

我在本地測試,當我打這個網址我得到這樣的迴應:

<Error> 
<Code>SignatureDoesNotMatch</Code> 
<Message> 
The request signature we calculated does not match the signature you provided. Check your key and signing method. 
</Message> 
<AWSAccessKeyId>AKIAIWUTWWWBZM3IZNJAQ</AWSAccessKeyId> 
<StringToSign> 
GET 1505923677 /my-bucket-name/button.png 
</StringToSign> 
<SignatureProvided>J41L/yY6SipfRcQa6yEjlrWahY8=</SignatureProvided> 
<StringToSignBytes> 
47 45 54 0a 0a 0a 31 35 30 35 39 32 33 36 37 37 0a 2f 63 6f 6e 70 61 73 73 2d 64 65 76 2f 63 6f 6e 70 61 73 73 2d 63 74 61 2d 62 6c 75 65 2d 31 78 2e 70 6e 67 
</StringToSignBytes> 
<RequestId>62398629E214AC9D</RequestId> 
<HostId> 
ZD9X7KkvhtKA5PBjfQXGo+IhHRSa0vVnWyEhdepB2O8h50OEP5iEsCHpV/UY27QqPFEgHf0kLu0= 
</HostId> 
</Error> 

我檢查了我的憑據是正確的,沒有任何空間,任何特殊字符。但我不知道爲什麼我永遠不能工作。

我不知道,因爲我甚至無法獲得標識的URL(上傳之前)的關聯,但我的CORS設置情況如下:

<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
<CORSRule> 
    <AllowedOrigin>*</AllowedOrigin> 
    <AllowedMethod>PUT</AllowedMethod> 
    <MaxAgeSeconds>3000</MaxAgeSeconds> 
    <AllowedHeader>Content-Type</AllowedHeader> 
    <AllowedHeader>x-amz-acl</AllowedHeader> 
    <AllowedHeader>origin</AllowedHeader> 
</CORSRule> 
</CORSConfiguration> 

我期待着關於如何的一些想法克服這個問題。

+0

你調用與數據投入到預標識的URL?想知道爲什麼當你的PUT用於/my-bucket-name/file.jpg時,診斷顯示爲GET /my-bucket-name/button.png。 PS你永遠不應該在網頁的源代碼中包含訪問密鑰和密鑰。 – jarmod

+0

錯誤表明您的訪問密鑰和密碼錯誤。你不斷提到「沒有特殊字符的祕密」。你的祕密應該和它給你的一樣。不要刪除任何特殊字符。作爲一個測試,你應該可以用你的訪問密鑰做一個's3:ListBuckets'來驗證它的工作正常。 –

+0

當您實例化S3客戶端時,您是否指定了與該存儲桶所在位置相對應的區域?有些地區強制要求特定的簽名算法,要求指定一個區域 –

回答

0

您正在嘗試對PUT網址執行GET操作。如果你想獲得一個標識的URL爲GET方法,

var params = {Bucket: 'bucket', Key: 'key', Expires: 60}; 
var url = s3.getSignedUrl('getObject', params); 
console.log('The URL is', url); // expires in 60 seconds 

在詳細的文檔,

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl-property

+0

我試圖從瀏覽器執行上傳,上面的代碼是在API中,並且是爲了獲得這個簽名的URL而創建的,因爲我可以看到它是正確的,因爲我想上傳它,所以我必須調用putObject而不是'getObject'。對?但我不知道爲什麼我在回覆中收到GET。 –

相關問題