Аутентификация приложения с помощью Cognito и Devise

Я пытаюсь внедрить AWS Cognito в свое приложение для лучшей всесторонней аутентификации. Система представляет собой приложение Rails, которое в настоящее время использует Warden/Devise в качестве метода управления учетными записями пользователей (вход в систему, регистрация).

Моя цель — иметь пул пользователей AWS, содержащий список пользователей для приложения. Когда пользователь проверяется с помощью Cognito, я хочу затем выполнить поиск в таблицах, которые мы в настоящее время используем для роли, и переместить пользователя в правильную область системы на основе назначенной ему роли.

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

Пожалуйста, смотрите ниже мой код.

cognito_authenticable.rb

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

def authenticate!
   if params[:login]
      region_name = 'us-east-2'
      user_pool_id = 'us-east-2_Qj78BNQon'
      client_id = '1pv3eno72e51mll3q36cuiojmr'

      client = Aws::CognitoIdentityProvider::Client.new(
         region: region_name
      )

      resp = client.initiate_auth({
         client_id: client_id,
         auth_flow: "USER_PASSWORD_AUTH",
         auth_parameters: {
           "USERNAME" => email,
           "PASSWORD" => password
         }
      })
     end
  end

divise.rb

Этот код предназначен только для добавления новой стратегии проверки подлинности в службу управления приложениями.

config.warden do |manager|
   manager.strategies.add(:cognito, 
   Devise::Strategies::CognitoAuthenticatable)
   manager.default_strategies(:scope => :login).unshift :cognito
   manager.default_strategies(:scope => :login).pop
end

Ошибка вывода в консоли

Aws::Errors::MissingCredentialsError (невозможно подписать запрос без набора учетных данных):

config/initializers/cognito_authenticable.rb:23:in `аутентифицировать!'

а вот изображение из запущенного приложения localhost.

Вывод веб-приложения после заполнения формы входа.

Любая помощь в этом была бы потрясающей.

Заранее спасибо.


person Murray Hart    schedule 22.03.2019    source источник
comment
У меня похожая проблема с моей стратегией Devise для Cognito. Но для меня это работает в моей локальной среде разработки, в то время как я получаю MissingCredentialsError в своей тестовой среде (приложение heroku). Также устанавливаются все соответствующие параметры Cognito. Я должен упомянуть, что я НЕ ПРОВЕРЯЛ генерировать секрет клиента в моем клиенте приложения, но все равно получаю ошибку.   -  person morgler    schedule 01.05.2019


Ответы (2)


Одним из решений может быть снятие флажка с опции создания секрета клиента при создании клиента приложения в пользовательском пуле Cognito. Эта опция включена по умолчанию, и вы должны знать, чтобы снять ее (https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-client-apps.html).

По умолчанию пулы пользователей создают секрет клиента для вашего приложения. Если вы не хотите, чтобы это произошло, снимите флажок Создать секрет клиента.

Снять секрет клиента можно только во время создания нового клиента, поэтому вам, возможно, придется удалить клиентское приложение и создать новое (не такая уж большая проблема).

Я также собираю свои знания о Cognito, Devise, Rails и VueJS в статье на Medium: https://medium.com/@morgler/beta-learnings-from-developing-vuejs-quasar-aws-amplify-and-cognito-application-dd38ec58b881< /а>

person morgler    schedule 01.05.2019

Вы получаете эту ошибку из-за того, что ваш AWS SDK для Ruby настроен неправильно. Эта ошибка, вероятно, существует не только для API Cognito, но и для любых вызовов API, подписанных AWS Signature V4. Пожалуйста, обратитесь к этой документации для правильной настройки SDK для вашего приложения.

person Arka Mukherjee    schedule 02.05.2019