AWS Cognito - ограничить доступ к некоторым частям веб-сайта Static S3 для зарегистрированных пользователей - PullRequest
1 голос
/ 12 июля 2019

Я создаю небольшой статический сайт, который я разместил на s3.Я использовал Cognito, чтобы получить некоторую базовую проверку пользователя (войти, выйти).Я хочу ограничить определенные части веб-сайта только зарегистрированными пользователями.

Я работал через модуль 2 этого семинара https://github.com/aws-samples/aws-serverless-workshops/tree/master/WebApplication. В этом семинаре страница /rides.html ограничена для зарегистрированных пользователей.,Если вы не вошли в систему и попытаетесь получить доступ к /rides.html, страница начнет загружаться, а затем быстро перенаправит вас на /signin.html.Проблема в том, что неавторизованные пользователи все еще могут просматривать страницу поездок за доли секунды до того, как произойдет перенаправление.

Вот их код, который обрабатывает перенаправление пользователя, который не вошел в систему. Он запускается как javascript, когдапользователь пытается получить доступ к /rides.html

   WildRydes.authToken.then(function setAuthToken(token) {
       if (token) {
           authToken = token;
       } else {
           window.location.href = '/signin.html';
       }
   }).catch(function handleTokenError(error) {
       alert(error);
       window.location.href = '/signin.html';
   });

У меня много проблем с поиском наилучшего способа обеспечить доступ к частям моего веб-сайта только пользователям, вошедшим в систему.Очень плохо знакомый со всем, что связано с webdev / AWS, и у меня возникают проблемы с поиском этой информации в Интернете.

Редактировать: Чтобы прояснить, чего я хочу достичь - я хочу, чтобы вся страница rides.htmlбыть недоступным для всех, кто не вошел в систему.

Решение: В итоге мы поставили ограниченный CloudFront перед корзиной s3.Затем у нас была лямбда, когда кто-то пытался получить доступ к CloudFront.Вот учебник: https://douglasduhaime.com/posts/s3-lambda-auth.html

1 Ответ

0 голосов
/ 12 июля 2019

Я не работал в упомянутом вами семинаре, но после прочтения README модуля 2 я понял, что они реализуют Аутентификацию пользователей и регистрацию в пуле пользователей Amazon Cognito .

Перенаправлениес сайта, который недоступен, это нормально, вы не должны гарантировать, что он никогда не загружается.Позвольте мне объяснить, почему:

«Чувствительная» информация, отображаемая на сайте, является не статичной .Он загружается из бэкэнда REST в модуле 4. Поскольку аутентификация является статической с помощью JWT, данные никогда не загружаются из бэкэнда REST, если пользователь не аутентифицирован.

Итакчто должна делать страница /rides.html?

  • , если пользователь аутентифицирован (т.е. получил JWT, который является действительным), должен быть вызван сервер REST для получения данных
  • , еслипользователь не аутентифицирован (т.е. JWT отсутствует) или JWT присутствует и больше не действителен, пользователь должен быть перенаправлен на страницу входа в систему;обратите внимание, что до перенаправления не было получено никаких разумных данных от сервера REST

РЕДАКТИРОВАТЬ:

Чтобы ограничить доступ к одному объекту в S3, выможет добавить политику сегмента, подобную следующей, в корзину s3:

{
    "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>/rides.html"
        }
    ]
}

Это сделает все объекты общедоступными, кроме файла rides.html.Если вы хотите получить к нему доступ, вам придется использовать подписанный URL.[1]
Обратите внимание, что нельзя использовать ACL-контейнер или объект, который предоставляет всем открытый доступ в сочетании с этим подходом, поскольку это может помешать тому, чтобы объект оставался закрытым.

Другой подход (для использованияфедеративный пользователь вместо обычного пользователя IAM)

Я не знаю, работает ли следующее из-за ограничений в документации [2], но вы можете попробовать.
Возможно,используйте поставщика федерации веб-удостоверений в атрибуте NotPrincipal : "Federated": "cognito-identity.amazonaws.com".Затем вы можете сузить, какой федеративный пользователь имеет доступ к объекту rides.html с помощью условных ключей (например, cognito-identity.amazonaws.com: sub ).[3]

[1] https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-signed-urls.html

[2] https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notprincipal.html

[3] https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html

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