Токен CSRF session_store с ember-simple-auth вместе с Devise

Можно ли реализовать Rails csrf через cookie_store одновременно с использованием Ember-simple-auth Devise?

Такие руководства, как это one всегда деактивируйте Rails.application.config.session_store, что, насколько я понимаю, не позволяет Rails отслеживать токены csrf, из-за чего Rails теряет отслеживание сессийg. После попытки многих решений, включая:

  1. require jquery_ujs в манифесте Rails.
  2. Rails.application.config.session_store :disabled.
  3. https://github.com/abuiles/rails-csrf.
  4. Изменение адаптера Ember.js для добавления CSRF.

Конечный результат все еще почти такой же:

Не удается проверить подлинность токена CSRF, за которым следует Completed 422 Unprocessable Entity, если для параметра protect_from_forgery установлено значение :exception вместо :null_session.

Пример транзакции:

ЗАГОЛОВОК частичного запроса:

X-CSRF-Token:1vGIZ6MFV4kdJ0yYGFiDq54DV2RjEIaq57O05PSdNdLaqsXMzEGdQIOeSyAWG1bZ+dg7oI6I2xXaBABSOWQbrQ==

ЗАГОЛОВОК респондента

   HTTP/1.1 422 Unprocessable Entity
   Content-Type: text/plain; charset=utf-8
   X-Request-Id: 71e94632-ad98-4b3f-97fb-e274a2ec1c7e
   X-Runtime: 0.050747
   Content-Length: 74162

  The response also attaches the following:
  Session dump
  _csrf_token: "jFjdzKn/kodNnJM0DXLutMSsemidQxj7U/hrGmsD3DE="

Ответ rails-csrf от моей ветви csrf (ветка удалена).

beforeModel() {
    return this.csrf.fetchToken();
},

Partial dump of the return statement:

_result: Object
param: "authenticity_token"
token: "1vGIZ6MFV4kdJ0yYGFiDq54DV2RjEIaq57O05PSdNdLaqsXMzEGdQIOeSyAWG1bZ+dg7oI6I2xXaBABSOWQbrQ=="

Насколько я понимаю, все эти попытки решения имеют общий корень: session_store отключен...


person Deovandski    schedule 16.01.2016    source источник


Ответы (1)


Обновлять!

Ответ ниже оказался неправильным после того, как я узнал больше о защите CSRF и Ember-Cli-Rails.


Идея здесь состоит в том, чтобы иметь два хранилища: хранилище на основе файлов cookie только для токена csrf, которое поддерживается Rails, и локальное хранилище, поддерживаемое Ember-simple-auth, где токен аутентификации пользователя, адрес электронной почты и идентификатор позаботятся, пока Пользовательский сеанс SessionAccount наследует эти значения и проверяет их на сервере перед установкой пользователя, который будет доступен для всего Ember.js.

Проверка SessionAccount происходит для обнаружения любого вмешательства в localStorage. Проверка происходит каждый раз, когда SessionAccount запрашивает localStorage (например, перезагрузка страницы), поскольку он взаимодействует с сервером через модель токена (токен, электронная почта и идентификатор). Сервер отвечает 200 или 404 через TokenSerializer, который только отображает электронную почту или проверку. ошибка, таким образом, не раскрывая внешний интерфейс для просмотра других аутентификационных_токенов, если пользователь не войдет в систему через форму входа, которая требует адрес электронной почты и пароль.

Насколько я понимаю, слабые места в этой методологии недостаточно уязвимы, чтобы их можно было так легко взломать, если только:

  • Кто-то вторгается на сервер и получает содержимое базы данных. Несмотря на то, что пароли защищены солью, любой человек, у которого есть дамп базы данных, может изменить токен, адрес электронной почты и идентификатор localStorage на человека, которого он хочет выдать себя за другое лицо, и проверка сервера будет работать. Однако это можно свести к минимуму с помощью воркера, который меняет токен аутентификации для не вошедших в систему пользователей каждые 24 часа (или любой другой период времени). В разделе примера кода в настоящее время нет воркера, так как я до сих пор не узнал о них.
  • Кто-то знает пароль и адрес электронной почты человека, которого они хотят взломать... В данный момент я мало что могу с этим поделать.
  • Кто-то перехватывает данные, которые передаются через JSON API. Надежная реализация SSL должна работать хорошо.
  • Если ваш sessionAccount имеет что-то в строках is_Admin, то токен может быть отправлен вместе с запросом POST для запросов только администратора для дальнейшей проверки серверной части, поскольку вы никогда не можете доверять внешнему интерфейсу.
  • Что-то другое? Это те, о которых я знаю.

Теперь о практическом подходе:

  1. Установите Rails.application.config.session_store :csrf_cookie_store, key: '_xxxxx_id', httponly: false в session_store.db.
  2. Создайте csrf_cookie_store в lib и укажите его в application.rb. с require 'csrf_cookie_store'.
  3. Установите protect_from_forgery with: :exception в файле application.rb.
  4. Создайте TokenController для обработки проверки. .
  5. TokenSerializer, чтобы обратно отправлялось только электронное письмо.
  6. Обновите свой контроллер сеанса разработки, чтобы изменить токен при войти в систему и пропустить проверку токена подлинности при уничтожении сеанса.
  7. Проверьте свои маршруты, чтобы токены создавались только и иметь пользовательскую сессию Devise.
  8. Создайте Ember.js модель токена
  9. Сопоставьте свой SessionAccount с тем, что я созданный.
  10. Обновите свой Devise Authenticator, чтобы отправить удаление запрос к серверу, когда сеанс становится недействительным.
  11. Проверьте это.
person Deovandski    schedule 21.03.2016
comment
Я не понимаю ваше сообщение об обновлении. Означает ли это, что мы не должны следовать шагам, описанным в этом принятом ответе? Не могли бы вы обновить его, указав правильные действия, если вы помните, как вы решили эту проблему? Спасибо. :) - person Dirty Henry; 20.10.2016
comment
Приношу свои извинения за то, что забыл обновить ответ тем, что я на самом деле делал в то время. Я больше не помню, в чем именно заключалась разница, из-за которой ответ был недействительным, но я полагаю, что это было связано с тем, что серверная часть хранила токен и сеанс csrf для всех, что приводило к входу в одну и ту же учетную запись, даже если вошел другой пользователь. проблема была решена, и вы можете увидеть пример ее работы на github.com/Deovandski/Fakktion. Более того, вы можете прокрутить коммиты до того момента времени, когда я заявил, что проблема решена, если у вас есть время. - person Deovandski; 25.10.2016