Как я могу создать страницу только для членов с S3? - PullRequest
0 голосов
/ 21 марта 2020

Я хочу создать страницу только для членов, используя Cognito и S3. Мне удалось зарегистрироваться и войти в систему с помощью Cognito, но я не знаю настройки S3, к которой имеет доступ только зарегистрированный пользователь. Я надеюсь, что к S3 могут получить доступ только аутентифицированные роли, созданные во время создания Cognito. Как мне это сделать?

Ответы [ 3 ]

2 голосов
/ 22 марта 2020

Для управления доступом с помощью роли IAM, один из вариантов - использование Cognito Identity Pool, после входа в Cognito User Pool и получения токена JWT.

Представьте токен JWT в Identity Pool и получите токен AWS STS, связанный с ролью IAM, которую вы настроили в Cognito Identity Pool.

Пожалуйста, обратитесь к Доступ к AWS Службы, использующие пул удостоверений после входа в систему

Обратите внимание на разницу между пулом пользователей и пулом удостоверений, поскольку они представляют собой разные службы, но имеют одно и то же имя «Cognito», что может сбивать с толку.

Пул пользователей - это просто еще один сервис аутентификации, такой как auth0 или Google, Facebook. Мы не ожидаем, что сможем контролировать доступ к ресурсам AWS с помощью токена, который выдает Google или Auth0 при входе в систему. Точно так же мы не можем контролировать доступ к AWS ресурсам с помощью токена, который предоставляет пул пользователей при входе в пул пользователей.

Документ Amazon довольно неоднозначен и часто смешивает пул пользователей и пул удостоверений. в том же документе, приводящем к путанице.

Чтобы иметь возможность контролировать доступ к ресурсу AWS, нам нужны роль IAM и токен AWS STS, которые в принципе не имеют ничего общего с самим пулом пользователей (как в случае с Google, Auth0, et c).

Нам нужен механизм для привязки токена пула пользователей к роли IAM. Есть несколько вариантов.

  1. Использование Cognito Identity Pool Identity Pool - именно эта услуга для этой цели.

  2. Использование сопоставления групп пула пользователей Cognito с ролью IAM.

В качестве альтернативы, мы можем использовать AWS javasdcript SDK для непосредственного получения токена STS, взяв на себя роль и используя ее.

Опять же, будьте осторожны с документацией Amazon, касающейся как пула пользователей, так и пула удостоверений. Лично им не следует смешивать разностные услуги в одном документе. Пул пользователей - это просто еще один сервис провайдера Identity Token, такой как Auth0, но Identity Pool - это сервис для сопоставления внешнего токена, такого как Google, Auth0 или Userpool, с ролью IAM.

Если придерживаться токена JWT пула пользователей, другой альтернативой может быть использовать API Gateway Cognito User Pool Authorizer. Настройте шлюз API, к которому имеют доступ только аутентифицированные пользователи пула пользователей, и шлюз API обслуживает веб-содержимое S3.

Также ALB имеет опцию аутентификации внешнего провайдера идентификации. Это можно использовать, чтобы разрешить доступ только пользователям, прошедшим аутентификацию в пуле пользователей.

0 голосов
/ 22 марта 2020

Политика сегмента следующая.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::<your-bucket-name>/*"
        },
        {
            "Effect": "Deny",
            "NotPrincipal": {
                "AWS": "<your-user-arn>"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::<your-bucket-name>/*"
        }
    ]
}
0 голосов
/ 22 марта 2020

Это может быть грубо и ошибочно, но как именно вы получаете доступ к S3 следующим образом?

const cognitoUser = userPool.getCurrentUser();
if (cognitoUser != null) {
  cognitoUser.getSession(function(err, result) {
    if (result) {
      console.log('You are now logged in.');

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

      // Can't access it like this?
      window.location.href = "https://xxxxxxxxxxxxxxxxxxxxxx.s3.amazonaws.com/private/index.html";

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