Задать вопрос
@krv2k

Как работает аутентификация Яндекса через QR-код?

Пытаюсь разобраться с вариантами аутентификации в Яндексе, и никак не могу найти ответ что же происходит при использовании входа с помощью QR-кода (вопрос к режиму "Пароль + одноразовый пароль" как на скрине). Прочитал всю документацию, но такое ощущение, что она не совсем актуальная, да и ответа на мой вопрос в ней в принципе нет.

- Если входим по логину и паролю, то нужно еще ввести одноразовый код. Здесь все понятно, вопросов нет.
- Если входим по QR-коду, то никаких паролей не запрашивается и сразу выполняется вход.

К тому же, в документации к способам входа "Пароль + одноразовый пароль" и "Одноразовый пароль" почему-то один и тот же текст для описания входа по QR-коду:

Если приложение Яндекс Ключ распознает QR-код, то передаст в Яндекс ваш логин и одноразовый пароль и вы автоматически войдете в браузере.


Как это понимать? Не сервер при любых настройках просто отправляется одноразовый код?

https://yandex.ru/support/id/ru/auth
https://yandex.ru/support/id/ru/authorization/twofa

Также еще есть второй бонусный вопрос. Почему в настройках (см. скрин) нет варианта "Одноразовый пароль"? Это у меня какие-то ограничения или такую возможность убрали?

6900fc618c3fc368699828.png
  • Вопрос задан
  • 122 просмотра
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
  • Skillfactory
    DevOps-инженер
    6 месяцев
    Далее
  • Нетология
    Python-разработчик с нуля
    6 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
@knigaman
Абсолютно банально работает эта схема. На бекэнде генерируется токен который отправляется в браузер и из него формируется QR код который ты и видишь. Каждую секунду (или другой промежуток времени) браузер делает запрос на сервер с этим токеном и ждет команды на вход в аккаунт или какое-то другое действие (к примеру отклонение входа или устаревание токена и, соответственно, QR кода - это нужно чтобы иногда менять QR коды в целях безопасности). Если мы со своей мобилы сканируем QR код и одобряем вход то с мобилы летит на бекэнд команда для одобрения входа. Когда браузер снова обратится на бекэнд с токеном то бекэнд поймет что этот токен одобрен и выдаст сессию браузеру (кукисы или jwt токены или еще что).

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

UPD: Тут важный нюанс: если мы показываем токен в QR коде и потом им же стучимся на бекэнд за сессией то возникает уязвимость - любой прохожий отсканирует этот QR код и начнет в своем браузере стучаться с этим же токеном, ты одобряешь вход и в состоянии гонки злоумышленник может достучаться первым до бекэнда и перехватить твою сессию, а ты останешься с носом. Поэтому нужно генерировать пару открытый токен-закрытый токен. Открытый будет загоняться в QR код, а по закрытому будем стучаться к бекэнду за сессией. В этом случае не залазя в устройство перехватить вход будет невозможно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы