1

我寫灰燼應用程序,我想允許用戶上傳PDF文件,而我使用AWS的S3用於文件存儲。由於我不想對AWS信用卡進行硬編碼,因此我正在使用AWS Cognito創建臨時憑證,以便在用戶想要上傳/下載文件時對S3進行身份驗證。我創建了一個身份池在AWS的用戶,並配置了驗證和未經驗證的用戶關聯的IAM角色(身份驗證的用戶獲得只讀到我的S3容器中的一個訪問)。我正在使用我的Rails後端(它使用Devise)作爲身份池的身份驗證提供程序。對於我的前端身份驗證,我使用Ember Simple Auth和提供的Devise身份驗證器,因此用戶必須登錄才能請求令牌。下面是我拿,以獲得臨時憑證的步驟:AWS Cognito臨時憑證中的Cookie

1)從我的後端獲取一個AWS Cognito標識ID和令牌(使用我的後端從紅寶石AWS SDK get_open_id_token_for_developer_identity法)

2)創建一個新的CognitoIdentityCredentials使用Identity Id和Token來獲取臨時憑證,並將這些憑證存儲在cookie中(使用js-cookie)。

代碼:

 var AWS = window.AWS; 
     AWS.config.region = "us-west-2"; 
     AWS.config.credentials = new AWS.CognitoIdentityCredentials({ 
      IdentityPoolId: 'us-west-2:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', 
      IdentityId: response.identity_id, 
      Logins: { 
       'cognito-identity.amazonaws.com': response.token 
      } 
     }); 
     AWS.config.credentials.get(function() { 
      var date = new Date(AWS.config.credentials.expireTime); 
      Cookies.set("cognito_creds", { accessKeyId: AWS.config.credentials.accessKeyId, secretAccessKey: AWS.config.credentials.secretAccessKey, sessionToken: AWS.config.credentials.sessionToken }, { expires: date }); 
     }); 

我明白,存儲重要信息,如在cookie AWS憑證是一大禁忌,而肯定是不安全的。但請記住,我使用的是HTTPS,憑證在一小時後過期,與憑證關聯的IAM角色只能爲我的S3存儲桶之一提供只讀訪問權限。

我的問題是:是否值得安全風險來存儲這些creds餅乾,這樣我就不必從我的後端獲取令牌每一個頁面刷新,還是這種方式離開我太脆弱?

編輯:爲了闡明,我想要的替代解決方案是將憑證作爲屬性存儲在前端的Ember服務上,並在每次頁面重新加載時從我的後端獲取令牌,看起來非常有效。

回答

1

This previous question有一些類似的問題,它可能是值得一讀。簡短的版本,或者應該沒問題。這聽起來像是你已經完全限定了證書的範圍,所以如果你選擇保存它們,你就限制了爆炸半徑。

如果你想保持延遲降低,這是不是一個壞的路要走。如果你願意犧牲這種延遲,或者擔心可以從S3讀取的隱私,你可以去遠程獲取它們。