Разработка сеансов, истекающих слишком быстро (часы, а не дни)

#ruby-on-rails #ruby #authentication #devise #ruby-on-rails-6

#ruby-on-rails #ruby #аутентификация #разработка #ruby-on-rails-6

Вопрос:

Я переношу это из-за проблемы в репозитории разработки, поскольку я еще не знаю, действительно ли это ошибка. Я надеюсь, что кто-нибудь может помочь мне понять, почему мои сеансы разработки истекают так быстро.

Окружающая среда

Ruby 2.7.2 Rails 6.1 Разработка 4.7.3

Текущее поведение

Моя цель состояла в том, чтобы сохранять сеансы около 30 дней, прежде чем требовать от пользователя повторного входа в систему. С помощью стандартного devise, no invitable, я видел правильно сохраненное время сеанса в моих настольных браузерах, но короткие сеансы (истекающие в днях, иногда в часах) на мобильных устройствах. Я понял, что, возможно, мне нужно использовать :timeoutable

Я установил :timeoutable для пользовательской модели, включил и установил config.timeout_in в 29.days в devise.rb. За исключением того, что теперь с :timeoutable настроенными вместо более длительных сеансов 29.day все сеансы браузера закрываются примерно через час или два.

Ожидаемое поведение

Сеанс должен сохраняться в течение 29.дней, прежде чем требовать от пользователя повторного входа в систему.

Я чувствую, что мне не хватает чего-то очевидного, но я не могу его найти. Разве :timeoutable это не правильный способ добиться этого?

Обновить:

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

Несмотря на это, я все еще не убежден, что timeoutable работает правильно.

Ответ №1:

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

Первый — это механизм низкого уровня ActionDispatch::Session , предоставляемый Rails. Это состоит из набора промежуточного программного обеспечения, которое связывает идентификатор сеанса (который идентифицирует клиента, подключенного к приложению по запросам) с хранилищем сеансов. Это действительно может сохранять любой простой сериализуемый объект в запросах, и, хотя он чаще всего используется для аутентификации, он также выполняет другие действия, такие как флэш-сообщения.

Хранилище сеансов по умолчанию ActionDispatch::Session::CookieStore , безусловно, самое быстрое, но есть также несколько вариантов хранения данных сеанса на сервере. Вы устанавливаете время истечения срока действия файлов cookie для хранения сеанса через:

 Rails.application.config.session_store :cookie_store, expire_after: 30.days
 

Тогда есть то, что вы могли бы назвать сеансами аутентификации, которые на самом деле просто сохраняют утверждение (идентификатор) в тайнике, чтобы пользователю не нужно было предоставлять учетные данные (адрес электронной почты, пароль) в каждом запросе. В Devise все это обрабатывается драгоценным камнем Warden. При входе в систему Warden помещает этот идентификатор пользователя в хранилище сеансов и удаляет его при выходе из системы. Это регистрирует вас при входе / выходе при использовании определенного клиента. По умолчанию здесь нет фактического тайм-аута — он длится столько, сколько cookie-файл хранилища сеанса.

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

Комментарии:

1. Это информативно, и я еще не устал расширять rails session_store , но мог бы. Я не понимал, что это за Надзиратель и :timeoutable является «правильным» методом. Я все еще не понимаю, почему конфигурация не работает на мобильных устройствах. Мне остается только предположить, что это конфликт с тем, как быстро истекли сеансы safari в iOS, но это сделало бы это ошибкой, а не проблемой конфигурации.

2. В Safari есть некоторые функции защиты от отслеживания, такие как ITP, которые могут привести к быстрому истечению срока действия файлов cookie — я не совсем уверен, в чем именно проблема.

Ответ №2:

Вы можете просто добавить его в свою пользовательскую модель:

 devise :timeoutable, timeout_in: 29.days
 

timeout_in определяет время, в течение которого пользователь может быть неактивным для повторного запроса учетных данных. То есть срок действия сеанса пользователя истекает, только если он не взаимодействует со своим приложением в течение 29 дней.

Помните, что для использования :timeoutable дополнительные столбцы не нужны, и это не работает remember_me .

Подробнее: время ожидания

Комментарии:

1. Спасибо за попытку помочь, но, когда я читаю это, я не вижу, добавляет ли какая-либо деталь сверх того, что я уже изложил, за исключением перемещения туда, где timeout_in определен период. Я сомневаюсь, что изменение этого определения изменит поведение.

2. Я провел несколько тестов, и, по-видимому timeout_in , определенный в devise.rb работает не так хорошо, как определено в вашей собственной модели, как я показал на примере.

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