javascript - 如何只允许经过身份验证的用户(使用 cognito)访问自己的 S3 存储桶/ key ?

标签 javascript amazon-web-services amazon-cognito

我们的基本应用流程如下:

React 应用程序:用户登录 ---> 使用 cognito 进行身份验证 --> 然后重定向到可以将文件上传到 s3 的门户

s3中“文件夹”的结构方式如下: 每个用户的电子邮件在 s3 存储桶中都有一个文件夹/ key (我们将此存储桶称为“testbucket”)。

因此,如果我的电子邮件是 john@google.com,那么它将如下所示:Bucket - testbucket,key - john@google.com

约翰只能上传到该文件夹​​。

现在我的问题是,现在我正在检查“ key ”是否存在,如果不存在则拒绝对 s3 的请求。但是,随着添加了 KMS 层,我想知道,在节点中发出请求时是否传递 kms“主 key ”?如果是这样,我是否只需将 key 保存在 env 变量中并在调用时将其传入?

此外,我可以在策略中添加一些内容,将访问权限与 Cognito 或经过身份验证的用户电子邮件联系起来吗?如果可以的话我可以举个例子来说明如何做到这一点吗? (如何实现示例政策)

编辑 1:策略用户

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::mybucket"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "cognito/users/"
                    ]
                }
            }
        },
        {
            "Effect": "Deny",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject",
                "s3:ListObject"
            ],
            "Resource": [
                "arn:aws:s3:::mybucket/cognito/users/${cognito-identity.amazonaws.com:sub}",
                "arn:aws:s3:::mybucket/cognito/users/${cognito-identity.amazonaws.com:sub}/*"
            ]
        }
    ]
}

编辑2:修订政策

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::mybucket"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "cognito/users/"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::mybucket/cognito/users/${cognito-identity.amazonaws.com:sub}",
                "arn:aws:s3:::mybucket/cognito/users/${cognito-identity.amazonaws.com:sub}/*"
            ]
        }
    ]
}

然后我像这样进行 api 调用:

var authenticate = (val) => {
  var userData = {
    Username: val.user, // your username here
    Pool: userPool
  };
  var authenticationData = {
    Username: val.user, // your username here
    Password: val.pass, // your password here
  };
  var authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails(authenticationData);

  var cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);

  cognitoUser.authenticateUser(authenticationDetails, {
    onSuccess: function(result) {
      var accessToken = result.getAccessToken().getJwtToken();
      var idtoken = result.getIdToken().getJwtToken();

      var params = {
        IdentityPoolId: 'ca-central-1:****',
        Logins: {
          'cognito-idp.ca-central-1.amazonaws.com/****': result.getIdToken().getJwtToken()
        }
      }
      var cognitoidentity = new AWS.CognitoIdentity();
      cognitoidentity.getId(params, function(err, data) {
        if (err) console.log(err);
        else {
          var id = data.IdentityId;
          console.log(id);
          var params = {
            Bucket: 'mybucket',
            Key: `cognito/users/${id}/image.jpg`
          };
          s3.getObject(params, function(err, data) {
            if (err) console.log(err, err.stack);
            else console.log(data);
          });
        }
      });



    },
    onFailure: function(err) {
      console.log("---------")
      console.log(`this is ${JSON.stringify(err)}`);
    }
  });



}

最新编辑:

cognitoUser.authenticateUser(authenticationDetails, {
      onSuccess: function(result) {
          var accessToken = result.getAccessToken().getJwtToken();
          var idtoken = result.getIdToken().getJwtToken();
          var params = {
            IdentityPoolId: 'ca-central-1:***',
            Logins: {
              'cognito-idp.ca-central-1.amazonaws.com/***': result.getIdToken().getJwtToken()
            }
          }
          var cognitoidentity = new AWS.CognitoIdentity();
          cognitoidentity.getId(params, function(err, data) {
            if (err) console.log(err);
            else {
              // console.log(data);
              var id = data.IdentityId;
              console.log(id);

              var params = {
                IdentityId: `${id}`,
                Logins: {
                  'cognito-idp.ca-central-1.amazonaws.com/***': result.getIdToken().getJwtToken()
                }
              };
              cognitoidentity.getCredentialsForIdentity(params, function(err, data) {
                if (err) console.log(err, err.stack); // an error occurred
                else {
                  // console.log(data);           // successful response
                  var creds = new AWS.Credentials({
                    accessKeyId: `${data.Credentials.AccessKeyId}`,
                    secretAccessKey: `${data.Credentials.secretAccessKey}`,
                    sessionToken: `${data.Credentials.SessionToken}`
                  })
                  var s3 = new AWS.S3(creds);
                  console.log(creds);
                  var params = {};
                  s3.listBuckets(params, function(err, data) {
                    if (err) console.log(err, err.stack);
                    else console.log(data);
                  });

                }
              });



            }
          });

最佳答案

限制访问的最佳方法是创建动态策略。您可以通过基于认知身份池的子变量创建策略来实现此目的。请注意,此子项与您在认知用户池中看到的子项不同。这是您可以通过调用GetId获取的身份ID。 API。 您可以使用此子项创建策略,以便用户只能访问前缀包含此子项的 key 。所以基本上你是按文件夹限制访问。您可以阅读更多相关信息here

关于javascript - 如何只允许经过身份验证的用户(使用 cognito)访问自己的 S3 存储桶/ key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54928856/

相关文章:

javascript - 如何使用for循环从父节点中删除子节点(html div)

javascript - 如何解码 JSFuck 脚本?

amazon-web-services - 尝试将响应发布到Websocket时,AWS API Gateway“x509:证书由未知授权机构签名”

amazon-web-services - AWS Cognito - 凭证问题

amazon-web-services - AWS CloudFormer 支持哪些 AWS 服务?

amazon-web-services - React Native 中的 AWS Appsync 401 和 403 错误

javascript - for 循环。无法对语句进行硬编码

javascript - AngularJS 服务在调用 API 时无法正常工作?

c++ - AWS 上的 GLIBCXX 版本错误

node.js - 使用 Node js aws-sdk 检查 S3 上是否存在文件夹