Есть ли ошибки в моей схеме аутентификации по магической ссылке?
Хочу реализовать беспарольную аутентификацию на сайте с JWT-авторизацией. В качестве фреймворка использую Experss.
Сейчас вижу такой сценарий:
1) На странице логина пользователь вводит свой e-mail;
2) Проверка в базе, есть ли пользователь с таким e-mail.
3) Если пользователь найден, обновить refresh-токен и отправить ссылку с этим токеном на почту пользователя.
4) Пользователь переходит по ссылке. Выполнить проверку валидности refresh-токена.
5) Если refresh-токен валиден, то а) снова обновить refresh-токен б) выписать jwt-токен
6) Отправить новый refresh и jwt-токены на клиента.
То есть refresh-токен отправляется пользователю по email в открытом виде, но живет до первого перехода по ссылке. Предполагается, что refresh-токены актуальны 15 дней, но для тех, которые отправлены по email, можно установить срок годности в несколько часов.
Насколько этот вариант рабочий для сайта со средними требованиями по безопасности? То есть нет возможности вывести деньги с баланса пользователя за считанные минуты.
В любом случае, это моя первая попытка реализовать идентификацию "с нуля" и разобраться, как это работает. Поэтому буду благодарен за любую помощь.
P.S. Пока готовил вопрос, подумал о том, что в качестве дополнительной меры безопасности можно хешировать refresh-токен перед встраиванием в url.
А в чём заключается безопасность, если для входа в аккаунт достаточно получить доступ к почте? То есть даже пароль от почты не нужен, достаточно чтобы пользователь на минутку отошёл от компа с открытой почтой и без пароля, без ничего, злоумышленник получает полный доступ к аккаунту на твоём сайте.
Совсем другое дело 2ух этапка, там да.
romaro, ты не понял. Представим, что я хочу заполучить доступ к твоему аккаунту. Мне достаточно дождаться, когда ты отлучишься от компа буквально на минуту, после чего я на СВОЁМ компе запрошу вход по твоё почте, подойду к твоему компу, перешлю на свою почту пришедшее письмо со ссылкой для входа и удалю оба письма (входящее и исходящее) из твоей почты.
После этого я кликну по ссылке уже на своём компе и войду в твой аккаунт на правах полноценного пользователя и ты даже об этом не узнаешь.
Если бы аутентификация была с нуля, а вы сначала выбрали решение а потом пытаетесь им решить задачи под которые оно не пригодно. Вам вообще не нужен JWT и OAuth в этой схеме, они оба лишние, а вы их как-то пытаетесь сюда пристроить.
Да, потому что если у вас нет причин использовать JWT - не надо использовать JWT, а у их, скорей всего, нет. Если вы будете отдавать JWT, а не проставлять его сессионной кукой чтобы рефрешить на стороне клиента - это гораздо менее безопасно, т.к. любой XSS будет приводить к угону сессий. Если вы будете проставлять JWT токен в сессионную куку, и ставить на нее HttpOnly, то фактически будете иметь обычные сессии с кучей лишних оберток, т.к. фактически у вас рефреш будет передаваться в каждом запросе и логику рефреша все равно будет выполнять сервер, вместо того чтобы просто проверить сессию по какому-нибудь мемкешу. JWT спасает в ситуациях когда сложно хранить и проверять сессию централизовано, например у вас распределенный сервис и много датацентров географически разбросанных и между ними сложно и долго гонять трафик на каждый запрос. Если такой проблемы нет - то JWT не нужен.
WbICHA, при ровно тех же условиях "атакующий" ровно так же вместо почты открывает сам сайт и получает к нему доступ, если сессии с сайтом более-менее длинные. Или просто ставит трояна и сливает совсем все. Для среднестатистического сайта сессии будут длинными, т.к. если вы каждый час будете запрашивать 2FA у пользователя - у вас не будет пользователей. Авторизация через почтовые ссылки достаточно часто используется там, где нет высоких требований к безопасности, например medium позволяет так авторизоваться. При высоких требованиях к безопасности ссылка в почту используется как один из факторов 2FA, например blockchain.com так делает. Если у вас есть возможность восстановить доступ через почту (а она точно есть, если для регистрации необязателен телефон) - то в любом случае есть возможность увести эккаунт, имея доступ к почте.
Владимир Дубровин, всё верно, но всё это занимает время. Чем меньше требуется времени для получения полного доступа, тем хуже. Всё же получить доступ к девайсу на 30 секунд куда проще, чем на пару минут.
Владимир Дубровин, вы меня убедили, что JWT в моем случае не нужен. Просто хотел "пощупать" эту технологию на своем первом проекте. Может быть, вы посоветуете хорошую статью или видео по грамотной реализации сессий? Я не уверен, что нужно использовать для этого Passport... Просто хочу обойтись минимумом фрейморков, чтобы разобраться, как все работает на низком уровне.