В приложениях Rails очень просто разрешить пользователям входить в ваше приложение. Вы спрашиваете у них имя пользователя и пароль, проверяете их правильность и вводите их идентификатор в сеанс. Вероятно, это выглядит примерно так:

https://gist.github.com/adamcooke/f3b689a420aeaf61b3d2

Это «работает», однако не слишком безопасно. Хотя Rails гарантирует, что пользователи не смогут просматривать или вмешиваться в содержимое вашего сеанса, он ничего не делает, чтобы помешать кому-то украсть файл cookie сеанса другого пользователя и использовать его для выдачи себя за него. Вы спросите, как кто-то может получить ваш файл cookie сеанса?

  • Атака человека посередине на небезопасное соединение.
  • Физически украсть его из чьего-то браузера, пока они пьют кофе и забывают заблокировать свой компьютер.
  • Потеря вашего ноутбука/устройства с сохраненными вашими (постоянными) файлами cookie сеанса.

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

Чтобы решить эти проблемы, я создал гем, который хранит данные о ваших пользовательских сеансах в вашей базе данных и предоставляет вам полный контроль над тем, какие сеансы активны.

  • Когда кто-то входит в ваше приложение, ему выдается новый токен сеанса, который сохраняется в файле cookie.
  • Затем этот токен сеанса отправляется на ваш сервер при каждом запросе и может использоваться для поиска пользователя, который его «создал».
  • По каждому запросу мы обновляем сеанс с отметкой времени последней активности, IP-адресом и путем, который посетил пользователь. Это позволяет вам видеть, где в настоящее время находится пользователь в вашем приложении, и определять неактивные сеансы.
  • Сеанс, который не используется в течение 12 часов, истекает, и любые дальнейшие запросы с этим идентификатором сеанса потребуют от пользователя повторного входа в систему.
  • Вы можете предоставить им список их сеансов вместе с пользовательским агентом, последним IP-адресом, который его использовал, и временем. Если пользователь увидит подозрительный сеанс, он может отозвать его доступ к своей учетной записи.

А как же "помнить меня"?

Эту же систему можно использовать для того, чтобы определенные пользователи могли запоминать свои логины в некоторых браузерах. Чтобы сделать это с Authie, вы можете просто пометить его сеанс как постоянный. Это по существу отключает проверку неактивности и позволяет токену продолжать работать до 3 месяцев (хотя вы можете настроить это).

Как мне это получить?

Начать очень просто. Просто ознакомьтесь с README и установите гем в свое приложение.