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读取的隐私,你可以去远程获取它们。