В августе прошлого года AWS представила поддержку OAuth2 для Cognito, их службы входа и регистрации, которую вы можете использовать для создания инфраструктуры учетной записи пользователя. В него включена поддержка выпуска JSON Web Tokens (JWT) и использования JSON Web Keys (JWK).

При использовании OAuth2.0 для аутентификации и авторизации вы можете использовать его для аутентификации вашего API с учетными данными отдельного пользователя: пользовательским токеном доступа. Это открывает множество возможностей при построении распределенных персонализированных систем элегантным и, что более важно, безопасным способом. Вы можете рассматривать его как индивидуальный ключ API для пользователя, который постоянно обновляется.

До JWT эти токены были просто «хешами», которые могла проверять потребляющая система. Вполне можно использовать только для аутентификации, но это все, что нужно. С помощью JWT вы можете кодировать информацию в токенах как объект JSON. Это предлагает возможности для дополнительной безопасности, а также для добавления информации о пользователе, такой как идентификатор пользователя.

Этот последний факт делает использование JWT довольно мощным, поскольку теперь потребляющая система может «знать», какой пользователь сделал запрос, без необходимости запрашивать это у другой системы. Это значительно упрощает индивидуальную настройку или хранение данных для отдельного пользователя.

Мы использовали JWT с другими системами (например, Auth0 имеет поддержку) в прошлом и использовали его для аутентификации API, учитывая элегантный характер токенов.

Теперь, когда AWS представила поддержку JWT в Cognito, мы сразу же заглянули в него в поисках нового нашего проекта: приложения React Native, включая логин.

AWS Amplify

Для создания внешнего интерфейса приложения мы выбрали библиотеку aws-ampify для реализации AWS Cognito в React Native, включая поддержку OAuth2 / JWT.

AWS Amplify нацелен на взаимодействие с облачными сервисами, использующими приложения JavaScript, предлагая поддержку JavaScript для ряда мобильных сервисов AWS, таких как Cognito, Mobile Analytics и хранилище S3. Он построен на основе официального AWS SDK для JavaScript.

Библиотека довольно молода, и это примечательно; мы потратили первые пару дней на отладку некоторых проблем с Cognito. Но команда AWS работает довольно быстро, выпуская новый выпуск каждую неделю. Так что пока мы считаем, что ставка на AWS Amplify будет успешной.

Джанго-когнито-JWT

Мы строим большую часть наших бэкэндов на Django, и когда мы создаем API, мы обычно используем django-rest-framework. Это просто самый зрелый и универсальный вариант REST в пространстве Django.

Не хватало хорошей серверной части аутентификации для Cognito / JWT, поэтому мы решили ее создать.

Чтобы использовать его, установите библиотеку через pip, а затем просто добавьте свои настройки Cognito и настройте REST Framework для аутентификации по нему:

COGNITO_AWS_REGION = '<aws region>' # 'eu-central-1'
COGNITO_USER_POOL = '<user pool>'   # 'eu-central-1_xYzaq'
COGNITO_AUDIENCE = '<client id>'
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        ...
        'django_cognito_jwt.JSONWebTokenAuthentication',
       ...
    ],
    ...
}

Вы можете найти наш модуль в обычном месте: