2016-01-16 43 views
0

使用AWS JavaScript SDK v2.2.29(如鮑爾aws-sdk-js)的客戶端版本,這是可能的(雖然他們顯然不能接受的,因爲它暴露了真實的AWS憑據給客戶):AWS服務器端TemporaryCredentials是否可用於客戶端S3上傳?

var region = 'us-east-1', 
    accessKeyId = 'AZ12341234', 
    secretAccessKey = 'aBCde1FGhij2KLMnOPqr3TUvwx4YZ'; 

var creds = new AWS.Credentials(accessKeyId, secretAccessKey); 

creds.get(function() { 
    s3Location = new AWS.S3({ 
    region: my.region, 
    credentials: creds 
    }); 
    ready(); // which presents the upload form, binds events, etc.. 
}); 

的夢想就是分裂該過程分爲2個部分,一個安全的服務器端和下面的客戶端。

部分1.使用AWS JavaScript SDK(如aws-sdk)做到這一點的服務器的NodeJS端版本:

var creds = new AWS.TemporaryCredentials(accessKeyId, secretAccessKey); 

creds.get(function() { 
    var aws = { 
    accessKeyId: creds.accessKeyId, 
    sessionToken: creds.sessionToken, 
    region: my.region, 
    }; 
    // e.g. makes aws var available to client 
    res.render('form', { 
    aws: aws 
    }); 
} 

第2部分使用的客戶端版本的AWS JavaScript SDK(如鮑爾aws-sdk-js)至做這樣:

// e.g. aws = <from-server-side> 
var creds = new AWS.Credentials(aws.accessKeyId, null, aws.sessionToken); 
creds.get(function() { 
    s3Location = new AWS.S3({ 
    credentials: creds, 
    region: aws.region 
    }); 
    ready(); 
}); 

上面的代碼似乎工作,直到實際分塊上傳開始,這導致403:

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

看來S3 SDK可能會受到限制,即使這種交易在理論上是可能的,也不可能進行分段上傳。

應該這樣做嗎?任何想法如何?

回答

0

對於您的具體問題,您應該查看這些憑據的角色/策略,並確保您允許分段上傳。

另一種解決方案是爲客戶端請求服務器返回一個標識的URL,它允許客戶端獲取/直接上傳文件到S3(不使用AWS API而是直接使用HTTP。

我用FineUploader要做到這一點(上載),並且他們有一大堆的例子應該給你一個想法(即使你不想使用FineUploader)如何做到這一點:

http://docs.fineuploader.com/branch/master/endpoint_handlers/amazon-s3.html

Heruku也有一個例子:https://devcenter.heroku.com/articles/s3-upload-node

但是你正在做什麼(或使用Cognito做類似的事情)應該可以工作。因此,問題必須與您正在創建的臨時證書關聯的角色/策略相關。

+0

請澄清「任何人都可以輕鬆從服務器獲取憑據」。在最後一個示例中(不是不安全的第一個示例),憑據是服務器端的,對吧?我只想將TemporaryCredentials發送給客戶。我還沒有嘗試過,但我不覺得在請求Temporary Credentails時提供IAM角色會導致提供臨時密鑰+祕密(ala Cognito,但沒有用戶生成) – charneykaye

+0

我的錯誤。我沒有太多的JavaScript API經驗,也沒有意識到TemporaryCredentials是用於使用AWS STS的。所以是的,你做的是正確的事情。我會更新或刪除我的答案。您的問題可能與與臨時憑證關聯的IAM角色有關。 – dkarchmer

相關問題