Мое чтение Cognito заключается в том, что его можно использовать вместо локальной базы данных администратора Django для аутентификации пользователей веб-сайта. Однако я не нахожу никаких простых примеров простого приложения «Hello, World» с экраном входа, который проходит через Cognito. Я был бы очень признателен, если бы кто-то мог опубликовать статью, в которой пошагово показано, как создать приложение Hello World Django и пул пользователей Cognito, а затем как заменить аутентификацию по умолчанию в Django вызовом AWS. Cognito .

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

Необходимо рассмотреть два случая: вход пользователя в приложение и вход администратора в адрес администратора сайта django. Я предполагаю, что я хотел бы использовать Cognito для обоих случаев, в противном случае я оставляю потенциальную дыру, когда URL-адрес администратора использует более слабую технологию входа в систему.

В текущих ответах на форумах AWS и в StackExchange говорится:

(1) Использование Cognito для аутентификации веб-сайта - пустая трата времени, оно предназначено только для доступа к ресурсам AWS.

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

(3) https://github.com/capless/warrant, https://github.com/metametricsinc/django-warrant - два возможных решения на форумах aws.

33
Lars Ericson 29 Май 2017 в 07:41

2 ответа

Лучший ответ

Если вы читаете это, вы, вероятно, погуглили «aws cognito django» xD.

Я просто хочу поделиться тем, что я сделал, чтобы заставить эту вещь работать:

  • Django-Warrant. Отличная упаковка для когнитив.
  • Удостоверьтесь, что понимаете вашу текущую структуру модели User. Если вы используете пользовательскую модель пользователя, не забудьте отобразить ее, используя параметр COGNITO_ATTR_MAPPING.
  • Измените свою аутентификацию для поддержки подключения сторонних производителей. Когда вы получаете от клиента токен Cognito, преобразуйте его в свой собственный токен, используя oAuth / JWT / Session.

  • Пересмотрите ваш процесс входа в систему / регистрации. Хотите другую регистрацию? Пакет django-warrant поддерживает это ...

В конце концов, это БОЛЬШОЕ решение для быстрой аутентификации.

27
Gal Silberman 22 Фев 2018 в 10:00

Чтобы добавить к принятому ответу, есть простой, но очень важный дополнительный шаг, который я нашел необходимым сделать, чтобы использовать django-warrant с Django 2.0:

Условие в backend.py в корневом пакете необходимо изменить с:

    if DJANGO_VERSION[1] > 10

Чтобы :

    if DJANGO_VERSION[1] > 10 or DJANGO_VERSION[0] > 1:

Использование django-warrant с Zappa и AWS Lambda:

В проекте, над которым я работаю, также используется Zappa, чтобы обеспечить возможность безсерверного развертывания моего приложения Django на AWS Lambda. Хотя приведенный выше код исправил django-warrant для меня при локальном тестировании, после развертывания приложения в среде Lambda у меня возникла еще одна серьезная проблема, связанная с некоторыми из пакетов поддержки django-warrant, в первую очередь связанных с python-jose-pycryptodome, которые django- использование ордера в процессе аутентификации. Проблема проявлялась в форме ошибки FileNotFound, связанной с файлом Crypto._SHA256. Эта ошибка, по-видимому, была вызвана тем, что pycryptodome ожидает, что различные файлы будут доступны в пакете Crypto во время выполнения в Windows (которую я разрабатываю) и Linux (среда Lambda) соответственно. Я решил эту проблему, загрузив Linux-версию pycryptodome и объединив ее пакет Crypto с пакетом Crypto из версии Windows.

TLDR. Если вы хотите использовать django-warrant с AWS Lambda и разрабатываете на компьютере с Windows, обязательно загрузите версию pycryptodome для Linux и объедините ее пакет Crypto с той же самой версией из версии Windows.

Примечание. Версии pycryptodome и python-jose (не python-jose-cryptodome), которые я использовал для достижения вышеизложенного, были 3.7.2 и 3.0.1 соответственно.

4
Isaac Doidge 4 Янв 2019 в 07:07