Занимаюсь созданием REST API на node.js + express + mysql для vue приложения. Сделал авторизацию с помощью passport с jwt стратегией. Как всегда сначала думал, что все легко и просто, потом начал изучать как и где безопасно хранить токен, и понял, что все сложно)). В общем я немного запутался уже, везде пишут, что токен могут украсть и делать запросы к api используя токен, рефреш токен так же могут увести и получить вообще бесконечные токены. Но я вот подумал(возможно не прав): пользователь ввел имя и пароль, приложение(vue) отправляет эти данные и в ответ получает токен, этот токен сохраняется в куках(например) и при последующих запросах берется из куков и добавляется к запросу. Следовательно все запросы к API будут идти с одного ip(на котором висит сам сайт), и тогда в api я могу(наверно) проверять с какого ip пришел запрос и если ip не моего сервера на котором висит сайт, то запрос не выполнять. Или я не прав? И еще не понял, как сделать токен не валидным принудительно? Допустим увели токен, как я могу его сделать не валидным? Нужно ли где-то хранить список всех выданных токенов? Как я понял, что бы использовать рефреш токен я должен генерировать два токена с разным временем жизни и оба их отдавать юзеру, да? Какое время жизни лучше делать для access токена, а какое для refresh? В общем вопросов много) помогите разобраться пожалуйста). Хочется сделать нормальную авторизацию, что бы пользователям не приходилось часто вводить логин и пароль, как в vk.com например, один раз ввел и забыл.
https://gist.github.com/zmts/802dc9c3510d79fd40f9d...
Отдаешь два токена и время жизни access token, которое обычно минут 30.
Соответственно если угоняют access, то он стухнет через пол часа, а если угонят оба, то юзер не сможет обновить по реврешу, его кинет на перелогин и тогда у угонщика все стухнет.
Почитал статью, спасибо! Но все равно не понятно как быть с ситуацией, когда юзер залогинен на нескольких устройствах(несколько рефрешей хранятся в базе) и у него угоняют access и refresh с одного устройства, которым например он очень редко пользуется. Соответственно злоумышленник будет иметь доступ к api от имени пользователя, пока пользователь не зайдет на сайт с этого устройства. А это может быть очень долгий срок, например у меня есть планшет и я им пользуюсь крайне редко, но при этом везде залогинен с него, получается если я месяц не буду им пользоваться, то хакер сможет месяц юзать мою учетку.
Александр Крымов, ну угнать все таки не так просто, нужно это учитывать, а так да, уже свои эвристики брать, показывать например юзеру сессии и устройства, предупреждать об активности
akass, ок, спасибо! Вроде прояснилось)). Раньше не думал, но теперь понял, что в личном кабинете нужно будет сделать раздел с активными сессиями и дать возможность пользователям обрывать сессии.