用于 Web 和移动应用程序的 S3 存储桶策略和 Cognito AWS 连接(rails 和离子)

S3 Bucket policy and Cognito AWS connection for web and mobile app (rails and ionic)

我正在尝试使用 Cognito AWS 来创建一个未经身份验证的用户连接,每当我们的一个用户登录到我们的应用程序(网络或移动设备)时。这样我就可以为注册用户创建安全的 S3 存储桶策略。

我能够post成功进入亚马逊,运行在浏览器中输入此代码。

AWS.config.region = 'us-east-1';

AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: "<%= ENV['AWS_IDENTITY_POOL_ID'] %>",
});

AWS.config.credentials.get(function(){
  aws_client = new AWS.CognitoSync();
});

然后我希望能够访问我的 S3 存储桶中的资产(使用它的 url),它有一个基于我的 IdentityPool 的策略。

url 只是标记中的 link,不能使用 javascript 访问。我错过了什么?当我从应用程序转到 url 时,AWS 提供拒绝访问。

您是否使用从 Cognito 获得的凭据签署 S3 URL?您可以使用任何 AWS 凭证签署 S3 URL。查看 S3 中可用的 getSignedURL 方法。

此外,如果您只想获取临时凭证并根据这些凭证的策略访问 S3,则不需要 Cognito Sync。从 Congito Identity 获取凭据应该就足够了。 Cognito Sync 可用于跨设备存储和同步数据。使用Sync服务,您无需维护自己的S3资源,也无需担心同步逻辑。

谢谢 Chetan,我设法使用 getSignedUrl 使事情正常进行。

对于任何想知道的人,这就是我所做的:

使用 Javascript 适用于移动应用程序的 AWS 开发工具包:

AWS.config.region = 'us-east-1';
AWS.config.credentials = new AWS.CognitoIdentityCredentials({ IdentityPoolId: "Our Identity Pool Id, found in Cognito menu" })
var s3 = new AWS.S3()
var params = {Bucket: 'bucket_name', Key: 'file_name'}
var url = s3.getSignedUrl('getObject', params)

而在 web 应用程序上,我可以使用 slick Ruby aws sdk 编写一个简单的方法:

# In initializers, as aws.rb
Aws.config.update({
  region: 'us-west-2',
  credentials: Aws::Credentials.new(
  ENV['AWS_ACCESS_KEY_ID'],
  ENV['AWS_SECRET_ACCESS_KEY']
  )
})

# In the Upload model, or wherever you store image data
def aws_url
  @presigner = Aws::S3::Presigner.new
  @presigner.presigned_url(
    :get_object,
    bucket: ENV['S3_BUCKET'],
    key: file_name,
    expires_in: 1.day.to_i
  ).to_s
end

最后,允许移动和 Web 应用程序安全访问的 S3 存储桶策略。

{
"Version": "2012-10-17",
"Id": "http resource policy example",
"Statement": [
    {
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::S3_Bucket_Name/IdentityPoolId"
    }
  ]
}