Как реализовать опцию «remember me» на нескольких устройствах для одного пользователя?
Из коробки Laravel предоставляет функцию запоминания пользователей, которая работает только на одном устройстве для одного пользователя (из-за того, что в базе данных соответствие между пользователями и remember_token'ами один к одному). Это влечет за собой довольно странное для пользователя поведение моего сайта: зашел с пк->зашел с телефона-> вернулся на пк, но там сайт его уже забыл. Странно, что в таком популярном фреймворке, как laravel, этот момент так плохо реализован.
Можно было бы сделать отдельную таблицу remember_tokens, в которой хранить id пользователя, токен и id устройства, сделать кастомный guard и провайдер, но, насколько я понимаю, для того, чтобы я потом мог работать с системой аутентификации laravel (фасадом Auth, и другими вещами), моя модель User должна реализовывать интерфейс Authenicatable, но в нем все методы заточены под единственный remember_token...
Может я слишком всё усложняю? Каков правильный путь, чтобы это сделать?
Описанный функционал не является "стандартным"/"обычным". Может еще проверку по IP сразу докрутить, чтобы при копипасте токена другому человек он не работал? :)
Mikhail Osher, А как быть с контрактом Authenticatable? В нём все методы рассчитаны на то, что remember_token один. Или его не обязательно реализовывать?
Mikhail Osher, И вообще, зачем нужен интерфейс Authenticatable? Можно как-то узнать, где он используется? Если только для Guard`ов, то сделав свой Guard можно вообще не париться с реализацией этого интерфейса.
Mikhail Osher, ну да, логично, он же с Guard`ом связан. Свой Provider вроде не проблема сделать - это ведь задаётся в конфиге, как и Guard. Это все места, где используется Authenticatable?
Mikhail Osher, Пришла хорошая идея. Можно же сделать полностью корректную реализацию Authenticatable, просто внутри методов, которые работают с remember_token`ом, добавить логику для определения к какому устройству относится remember_token (id устройства можно хранить в cookie). Тогда даже не нужно писать свой Guard, судя по всему. Я же правильно мыслю?
Антон Алексеевич, спасибо за ваш ответ.
Лучше просто забыть, что я задавал этот вопрос... Ещё и попал в топ-3 интересных, LOL
Сейчас потестил в разных браузерах, работает всё идеально, без всяких настроек. Но я вообще не понимаю, почему это работает: следил за изменением remember_token в базе данных, он меняется при каждом logout. Я зашел в аккаунт с 2 браузеров, потом в одном вышел, токен в базе поменялся, но сайт продолжал помнить второй браузер, как и должно быть (хотя токен поменялся)...