В приложениях Rails очень просто разрешить пользователям входить в ваше приложение. Вы спрашиваете у них имя пользователя и пароль, проверяете их правильность и вводите их идентификатор в сеанс. Вероятно, это выглядит примерно так:
https://gist.github.com/adamcooke/f3b689a420aeaf61b3d2
Это «работает», однако не слишком безопасно. Хотя Rails гарантирует, что пользователи не смогут просматривать или вмешиваться в содержимое вашего сеанса, он ничего не делает, чтобы помешать кому-то украсть файл cookie сеанса другого пользователя и использовать его для выдачи себя за него. Вы спросите, как кто-то может получить ваш файл cookie сеанса?
- Атака человека посередине на небезопасное соединение.
- Физически украсть его из чьего-то браузера, пока они пьют кофе и забывают заблокировать свой компьютер.
- Потеря вашего ноутбука/устройства с сохраненными вашими (постоянными) файлами cookie сеанса.
Если вы просто сохраняете идентификатор пользователя в сеансе, вы ничего не можете сделать, чтобы отозвать доступ, за исключением изменения идентификатора пользователя, что, вероятно, нецелесообразно. Вы можете добавить в сеанс еще один токен, который затем можно изменить на сервере, чтобы сделать сеанс недействительным, но это не очень элегантно.
Чтобы решить эти проблемы, я создал гем, который хранит данные о ваших пользовательских сеансах в вашей базе данных и предоставляет вам полный контроль над тем, какие сеансы активны.
- Когда кто-то входит в ваше приложение, ему выдается новый токен сеанса, который сохраняется в файле cookie.
- Затем этот токен сеанса отправляется на ваш сервер при каждом запросе и может использоваться для поиска пользователя, который его «создал».
- По каждому запросу мы обновляем сеанс с отметкой времени последней активности, IP-адресом и путем, который посетил пользователь. Это позволяет вам видеть, где в настоящее время находится пользователь в вашем приложении, и определять неактивные сеансы.
- Сеанс, который не используется в течение 12 часов, истекает, и любые дальнейшие запросы с этим идентификатором сеанса потребуют от пользователя повторного входа в систему.
- Вы можете предоставить им список их сеансов вместе с пользовательским агентом, последним IP-адресом, который его использовал, и временем. Если пользователь увидит подозрительный сеанс, он может отозвать его доступ к своей учетной записи.
А как же "помнить меня"?
Эту же систему можно использовать для того, чтобы определенные пользователи могли запоминать свои логины в некоторых браузерах. Чтобы сделать это с Authie, вы можете просто пометить его сеанс как постоянный. Это по существу отключает проверку неактивности и позволяет токену продолжать работать до 3 месяцев (хотя вы можете настроить это).
Как мне это получить?
Начать очень просто. Просто ознакомьтесь с README и установите гем в свое приложение.