Cookie 中的 AWS Cognito 临时凭证
AWS Cognito Temporary Credentials in Cookie
我正在编写一个 Ember 应用程序,我希望允许用户在其中上传 pdf 文件,并且我正在使用 AWS S3 进行文件存储。因为我不想对我的 AWS 凭证进行硬编码,所以我使用 AWS Cognito 创建临时凭证,以便在用户想要 upload/download 文件时对 S3 进行身份验证。我在 AWS 上为用户创建了一个身份池,并为经过身份验证和未经身份验证的用户配置了关联的 IAM 角色(经过身份验证的用户获得对我的 S3 存储桶之一的只读访问权限)。我正在使用我的 Rails 后端(使用 Devise)作为我的身份池的身份验证提供程序。对于我的前端身份验证,我使用 Ember Simple Auth 和提供的 Devise 身份验证器,因此用户必须登录才能请求令牌。以下是我获取临时凭证所采取的步骤:
1) 从我的后端获取 AWS Cognito 身份 ID 和令牌(在我的后端使用来自 Ruby AWS SDK 的 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 服务上,并在每次重新加载页面时从我的后端获取令牌, 但这似乎不是很有效。
有一些类似的方面,可能值得一读。简短的版本是,两者都应该没问题。听起来你已经完美地缩小了凭据的范围,所以如果你选择保存它们,你就限制了爆炸半径。
如果您想降低延迟,这是一个不错的方法。如果您愿意牺牲这种延迟或担心可以从 S3 读取的内容的隐私,您可以远程获取它们。
我正在编写一个 Ember 应用程序,我希望允许用户在其中上传 pdf 文件,并且我正在使用 AWS S3 进行文件存储。因为我不想对我的 AWS 凭证进行硬编码,所以我使用 AWS Cognito 创建临时凭证,以便在用户想要 upload/download 文件时对 S3 进行身份验证。我在 AWS 上为用户创建了一个身份池,并为经过身份验证和未经身份验证的用户配置了关联的 IAM 角色(经过身份验证的用户获得对我的 S3 存储桶之一的只读访问权限)。我正在使用我的 Rails 后端(使用 Devise)作为我的身份池的身份验证提供程序。对于我的前端身份验证,我使用 Ember Simple Auth 和提供的 Devise 身份验证器,因此用户必须登录才能请求令牌。以下是我获取临时凭证所采取的步骤:
1) 从我的后端获取 AWS Cognito 身份 ID 和令牌(在我的后端使用来自 Ruby AWS SDK 的 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 服务上,并在每次重新加载页面时从我的后端获取令牌, 但这似乎不是很有效。
如果您想降低延迟,这是一个不错的方法。如果您愿意牺牲这种延迟或担心可以从 S3 读取的内容的隐私,您可以远程获取它们。