【发布时间】:2017-03-25 06:19:18
【问题描述】:
我正在编写一个 Ember 应用程序,我希望允许用户上传 pdf 文件,并且我正在使用 AWS S3 进行文件存储。因为我不想硬编码我的 AWS 凭据,所以我使用 AWS Cognito 创建临时凭证,以便在用户想要上传/下载文件时对 S3 进行身份验证。我在 AWS 上为用户创建了一个身份池,并为经过身份验证和未经身份验证的用户配置了关联的 IAM 角色(经过身份验证的用户可以只读访问我的 S3 存储桶之一)。我正在使用我的 Rails 后端(使用 Devise)作为身份池的身份验证提供程序。对于我的前端身份验证,我使用 Ember Simple Auth 和提供的 Devise 身份验证器,因此用户必须登录才能请求令牌。以下是我获取临时凭证的步骤:
1) 从我的后端获取 AWS Cognito 身份 ID 和令牌(在我的后端使用来自 Ruby AWS 开发工具包的 get_open_id_token_for_developer_identity 方法)
2) 使用 Identity Id 和 Token 创建一个新的 CognitoIdentityCredentials 对象以获取临时凭据,并将凭据存储在 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 存储桶的只读访问权限。
我的问题是:将这些凭据存储为 cookie 是否值得冒安全风险,这样我就不必在每次页面刷新时都从后端获取令牌,还是这种方法让我太容易受到攻击?
编辑:澄清一下,我正在考虑的替代解决方案是将凭据作为属性存储在前端的 Ember 服务上,并在每次页面重新加载时从我的后端获取一个令牌,但这不是看起来很有效率。
【问题讨论】:
标签: amazon-web-services cookies ember.js amazon-s3 amazon-cognito