Cookie中的AWS Cognito临时凭证

时间:2016-11-11 03:54:44

标签: amazon-web-services cookies ember.js amazon-s3 amazon-cognito

我正在编写一个Ember应用程序,我希望允许用户上传pdf文件,我正在使用AWS S3进行文件存储。因为我不想硬编码我的AWS信誉,所以我使用AWS Cognito创建临时凭证,以便在用户想要上传/下载文件时对用户进行身份验证。我在AWS上为用户创建了一个标识池,并为经过身份验证和未经身份验证的用户配置了关联的IAM角色(经过身份验证的用户只能访问我的一个S3存储桶)。我使用我的Rails后端(使用Devise)作为我的身份池的身份验证提供程序。对于我的前端身份验证,我使用提供的Devise身份验证器使用Ember Simple Auth,因此用户必须登录才能请求令牌。以下是我获取临时凭证的步骤:

1)从我的后端获取AWS Cognito Identity Id和Token(使用我后端的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 } );
        });  

我知道将诸如AWS凭证等重要信息存储在cookie中是一个很大的禁忌,绝对不安全。但请记住,我使用HTTPS,凭据在一小时后过期,与凭据关联的IAM角色仅提供对我的一个S3存储桶的只读访问权限。

我的问题是:将这些信用卡存储为cookie是否值得安全风险,这样我每次刷新页面都不需要从后端获取令牌,或者这种方法是否让我太脆弱了?

编辑:为了澄清,我想到的替代解决方案是将凭证作为属性存储在前端的Ember服务上,并在每次页面重新加载时从我的后端获取一个令牌,但这不是看起来很有效率。

1 个答案:

答案 0 :(得分:1)

This previous question有一些类似的方面,值得一读。简短的版本,要么应该没问题。听起来你完全放下了凭证,所以如果选择保存它们,你就限制了爆炸半径。

如果你想要减少延迟,那么这不是一个坏的方法。如果您愿意牺牲延迟或者关注从S3可以读取的隐私,您可以远程获取它们。