使用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可能會受到限制,即使這種交易在理論上是可能的,也不可能進行分段上傳。
應該這樣做嗎?任何想法如何?
請澄清「任何人都可以輕鬆從服務器獲取憑據」。在最後一個示例中(不是不安全的第一個示例),憑據是服務器端的,對吧?我只想將TemporaryCredentials發送給客戶。我還沒有嘗試過,但我不覺得在請求Temporary Credentails時提供IAM角色會導致提供臨時密鑰+祕密(ala Cognito,但沒有用戶生成) – charneykaye
我的錯誤。我沒有太多的JavaScript API經驗,也沒有意識到TemporaryCredentials是用於使用AWS STS的。所以是的,你做的是正確的事情。我會更新或刪除我的答案。您的問題可能與與臨時憑證關聯的IAM角色有關。 – dkarchmer