首页 > 解决方案 > 我想创建一个只能由使用 Cognito 创建的用户在登录时访问的 S3 存储桶

问题描述

我希望通过以下方式访问:

const cognitoUser = userPool.getCurrentUser();
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: "us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,
Logins: {
  'cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxxxx': result.getIdToken().getJwtToken()
}
});

// このようにアクセスしたい。
window.location.href = "https://nabezokodaikon-private.s3.amazonaws.com/private/index.html";

我创建了以下 S3 存储桶策略。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
              "Federated": "cognito-identity.amazonaws.com"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::nabezokodaikon-private/*"
        },
        {
            "Effect": "Deny",
            "NotPrincipal": {
                "AWS": "arn:aws:iam::xxxxxxxxxxxx:user/nabezokodaikon"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::nabezokodaikon-private/index.html"
        }
    ]
}

但这无法访问。我怎样才能做我想做的事?

标签: amazon-web-servicesamazon-s3amazon-cognito

解决方案


当您的代码从 Cognito 获取凭证时,此行没有提供任何信息来标识请求来自 Cognito 凭证:

window.location.href = "https://nabezokodaikon-private.s3.amazonaws.com/private/index.html";

该 URL 只是一个普通的匿名请求,应该被拒绝(按原样)。

要访问私有内容,您需要创建一个预签名 URL ,该 URL使用 Cognito 提供的凭据对请求进行“签名”。预签名 URL 提供对 Amazon S3 中私有内容的限时访问。

请参阅:Amazon S3 预签名 URL

您还需要删除该Deny语句,因为它会阻止任何不是来自所述用户的访问。默认情况下,Amazon S3 存储桶是私有的,因此Deny只能在Allow需要覆盖的情况下使用。


推荐阅读