【问题标题】:AWS Cognito - S3 Access using IAM roleAWS Cognito - 使用 IAM 角色的 S3 访问
【发布时间】:2019-07-08 10:27:54
【问题描述】:

目前我正在处理一个用例,我需要使用 AWS Cognito 对 Web 应用程序用户进行身份验证,并提供对 S3 存储桶中用户特定文件夹的访问权限。为此,我在浏览器端使用 JavaScript 并能够对用户进行身份验证。

我创建了一个 IAM 策略,我试图将 S3 对用户特定文件夹的访问限制为经过身份验证的用户。不知何故,这项政策不起作用。

我在这里尝试的政策如下:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": [
            "cognito-identity:*",
            "mobileanalytics:PutEvents",
            "cognito-sync:*"
        ],
        "Resource": "*"
    },
    {
        "Sid": "VisualEditor1",
        "Effect": "Allow",
        "Action": "s3:ListBucket",
        "Resource": "arn:aws:s3:::mycognitobuckettest",
        "Condition": {
            "StringLike": {
                "s3:prefix": [
                    "cognito/mycognitobuckettest/${cognito-identity.amazonaws.com:sub}/",
                    "cognito/mycognitobuckettest/${cognito-identity.amazonaws.com:sub}/*"
                ],
                "s3:delimiter": [
                    "/"
                ]
            }
        }
    },
    {
        "Sid": "VisualEditor2",
        "Effect": "Allow",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::mycognitobuckettest/cognito/mycognitobuckettest/${cognito-identity.amazonaws.com:sub}/*"
    }
]}`

如果我从资源路径中删除 ${cognito-identity.amazonaws.com:sub},我就可以访问 S3 存储桶。但是,如果我将它放入资源路径和条件键中,我会收到拒绝访问错误。

据我了解,${cognito-identity.amazonaws.com:sub} 的值是区域 ID 和 uuid,您可以像这样获得 var identityID = AWS.config.credentials.identityId

我正在尝试列出资源路径中的对象,下面是我用来列出对象的 JavaScript 代码

var listObjectParms = {Bucket: bucketName, Delimiter: '/', Prefix: bucketPrefix};

    s3.listObjects(listObjectParms, function(err, data) {
        if(err) {
            console.log("Error", err);
        } else {
            console.log("LIST OBJECT successful", data);
        }
    });

${cognito-identity.amazonaws.com:sub} 的确切值是多少?

我已根据收到的身份 ID 在 S3 存储桶中创建了文件夹。

我现在被困在这一点上。 欢迎大家提供有关解决此问题的任何帮助。

谢谢,

阿维纳什

【问题讨论】:

    标签: javascript amazon-web-services amazon-s3 amazon-cognito


    【解决方案1】:

    我最近遇到了这个问题。此 ${cognito-identity.amazonaws.com:sub} 值不是您的 cognito 用户池中的任何内容。它是您从认知身份中获得的身份 ID。

    例如:us-east-1:aaaaaaa-bbbb-1111-ccccccccc11f

    您可以通过使用get_id 方法在用于 cognito 的 javascript sdk 中获取此 ID

    【讨论】:

    • 感谢您的回复。根据您的建议,我尝试使用 AWS.CognitoIdentity.getId() 方法来获取 cognito 身份。但是,我发现在这两种情况下,我都得到了相同的 Cognito Identity id。即var identityID = AWS.config.credentials.identityId;和 AWS.CognitoIdentity.getId() 返回相同的值。例如:us-east-1:1aae78bd-3688-4ba2-a38f-717d61cafb5d
    • bucketPrefix 设置了什么?它应该是身份 ID,因为这是您被允许访问的唯一路径
    • 再次感谢尼纳德。我在这里使用的 bucketPrefix 是这样的 BUCKET PREFIX :: cognito/mycognitobuckettest/us-east-1:1aae78bd-3688-4ba2-a38f-717d61cafb5d
    • 您能否授予它访问权限并检查您是否能够使用 cognito 凭据上传文件?
    • 您也可以再次尝试 list bucket 命令,但在末尾添加一个正斜杠,如cognito/mycognitobuckettest/us-east-1:1aae78bd-3688-4ba2-a38f-717d61cafb5d/
    猜你喜欢
    • 2017-05-27
    • 2019-06-10
    • 1970-01-01
    • 2016-07-10
    • 2022-06-30
    • 2019-10-26
    • 2016-04-07
    • 2018-05-04
    • 2016-07-04
    相关资源
    最近更新 更多