2014-09-06 110 views
12

我創建了一個IAM策略以允許Cognito用戶寫入我的S3存儲桶,但我想根據他們的Cognito ID將它們限制爲文件夾。我跟着亞馬遜的指示here並創建了一個政策,看起來像這樣:基於Cognito ID的S3文件夾訪問的IAM策略

{ 
    "Effect": "Allow", 
    "Action": ["s3:PutObject","s3:GetObject"], 
    "Resource": [ 
     "arn:aws:s3:::mybucket/myappfolder/${cognito-identity.amazonaws.com:sub}*" 
    ] 
} 

但是當我嘗試使用AWS的iOS SDK的V2上傳我得到一個拒絕訪問錯誤。

如果我修改了資源的最後一個路徑組件與明確identityId值我從SDK的AWSCognitoCredentialsProvider它的作品越來越更換${cognito-identity.amazonaws.com:sub}

{ 
    "Effect": "Allow", 
    "Action": ["s3:PutObject","s3:GetObject"], 
    "Resource": [ 
     "arn:aws:s3:::mybucket/myappfolder/us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx*" 
    ] 
} 

我的理解是這些應該等同於相同的東西。我是否在我的策略中遺漏了某些內容,或者是否應該在我的上傳請求中使用不同的路徑?

** 更新 **

我本來在iOS的這一問題,所以今晚我想這樣做在node.js的同樣的事情,結果是相同的。這裏是我使用節點的簡單代碼:

var s3 = new AWS.S3(); 

AWS.config.region = 'us-east-1'; 

AWS.config.credentials = new AWS.CognitoIdentityCredentials(AWSParams); 

AWS.config.credentials.get(function (err) { 

    if (!err) { 

     console.log("Cognito Identity Id: " + AWS.config.credentials.identityId); 

     var bucketName = 'ch123_test_bucket'; 

     var keyName = AWS.config.credentials.identityId + '.txt'; 

     var params = {Bucket: bucketName, Key: keyName, Body: 'Hello World!'}; 

     s3.putObject(params, function (err, data) { 
      if (err) 
       console.log(err) 
      else 
       console.log("Successfully uploaded data to " + bucketName + "/" + keyName); 
     }); 
} 

而且,我感到我與iOS得到相同的結果:除非我在IAM策略提供一個明確的cognito ID的API與403

響應

我已將我的IAM政策剝離到最低限度。這不起作用:

{ 
    "Statement": [ 
    { 
    "Effect": "Allow", 
    "Action": ["s3:PutObject","s3:GetObject"], 
    "Resource": [ 
     "arn:aws:s3:::ch123_test_bucket/${cognito-identity.amazonaws.com:sub}*" 
     ] 
    } 
] 
} 

這並不:

{ 
"Statement": [ 
    { 
    "Effect": "Allow", 
    "Action": ["s3:PutObject","s3:GetObject"], 
    "Resource": [ 
     "arn:aws:s3:::ch123_test_bucket/us-east-1:68a5dc49-6cc7-4289-8257-d3d5636f7034*" 
    ] 
    } 
] 
} 

我不明白我在這裏失蹤......我已經能夠隨時找到的唯一的文檔顯示相同的示例我一直在使用的資源值。

+0

要清楚,您包含的第一個策略與第二個策略不匹配。你確定他們是一樣的嗎?你可以包含你在你的應用中使用的代碼嗎?您是否使用轉帳管理員? – 2014-09-07 01:37:29

+0

@BobKinney我已經更新了我的問題以顯示一個簡單的node.js示例來說明問題。 – ChrisH 2014-09-09 05:41:50

+0

@ChrisH,謝謝你的詳細問題。我只是有一個評論和一個問題。我的評論:這行'var s3 =新的AWS。S3();'應該在設置證書之後(在第三行),否則會發生錯誤。問題是:你寫的是未認證的用戶,你如何爲認證的用戶做同樣的事情?謝謝! – securecurve 2015-09-02 13:45:17

回答

10

不幸的是,目前通過Cognito控制檯與策略變量結合生成的角色存在問題。請更新您的角色訪問策略包括以下內容,以確保政策變量正確評估:

"Version": "2012-10-17" 

2014年9月16日更新:我們更新了亞馬遜Cognito控制檯來解決此問題的通過身份庫創建嚮導創建的角色。現有角色仍需要進行上述修改。

+1

這很關鍵,我花了3個小時尋找它......非常感謝!你應該**修正[DynamoDB on Android指南](http://docs.aws.amazon.com/mobile/sdkforandroid/developerguide/dynamodb_om.html),因爲它是我所遵循的,而且它確實沒有這個版本字段! – 2015-12-11 18:57:08

+0

@Dadou對這些問題表示歉意。它沒有版本的部分原因是因爲列出的策略不需要它,因爲它不使用策略變量。 – 2015-12-14 16:36:34

0

您缺少最後一個斜槓。

{ 
    "Effect": "Allow", 
    "Action": ["s3:PutObject","s3:GetObject"], 
    "Resource": [ 
     "arn:aws:s3:::mybucket/cognito/myappfolder/${cognito-identity.amazonaws.com:sub}/*" 
    ] 
} 

也試着考慮這個article

+1

謝謝,但尾隨'/'沒有任何區別。您鏈接的SO問題證實了我的想法......並建議我的IAM政策應該有效。 – ChrisH 2014-09-09 03:19:27

相關問題