Как мне разрешить только аутентифицированному пользователю (используя cognito) доступ к его собственному контейнеру / ключу S3? - PullRequest
0 голосов
/ 28 февраля 2019

Наш основной поток приложений выглядит следующим образом:

Реагирует приложение: пользователь входит в систему ---> проходит аутентификацию с использованием cognito ->, а затем перенаправляется на портал, где они могут загружать файлы в s3

Структура «папок» в s3 выглядит следующим образом: электронная почта для каждого пользователя имеет папку / ключ в корзине s3 (давайте назовем эту корзину «testbucket»).

Так что, если мой адрес электронной почты будет john@google.com, он будет выглядеть следующим образом: Bucket - testbucket, key - john@google.com

И john может загружать только в эту папку.

Теперь мой вопрос: сейчас я проверяю, существует ли «ключ», если нет, отклонить запрос к s3.Однако, с добавленным уровнем KMS, я хочу знать, передам ли я "главный ключ" kms при выполнении запроса в узле?Если да, то я просто сохраню ключ в переменной env и передам его при вызове?

Кроме того, могу ли я добавить в политику что-то, связывающее доступ к cognito или к электронной почте пользователя, которая аутентифицирована?Если да, могу ли я получить пример, как это сделать?(как реализовать пример политики)

edit 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}/*"
            ]
        }
    ]
}

edit 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);
                  });

                }
              });



            }
          });

1 Ответ

0 голосов
/ 01 марта 2019

Лучший способ ограничить доступ - создать динамическую политику.Вы можете сделать это, создав политику, основанную на суб-переменной пула идентификации cognito.Обратите внимание, что этот саб не тот, который вы видите в пуле пользователей Cognito.Это идентификатор, который вы можете получить, позвонив в GetId api.Используя эту подпрограмму, вы можете создать политику, чтобы пользователь имел доступ только к ключам с префиксом, содержащим эту подпрограмму.Таким образом, в основном вы ограничиваете доступ к папке.Вы можете прочитать больше об этом здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...