Вы точно не путаете двухфакторку с пин защитой ?
Сперва стоит понять нужно ли что-то подобное для вашего сайта.
Если клиенты вашего сайта вынуждены работать с ним с пк, к которому может подойти посторонний человек.
Например, вы написали CRM для сотрудников торгового зала в магазине.
Но даже в таком случае вместо пина можно, по таймауту неактивности (отсутвия запросов к серверу).
Через JS вывести заглушку. А при попытке F5 (рефреша страницы).
показывать кастомизированную форму логина (Типа Вы такой-то такойтович) введите свой пароль. или войдите под другим логином.
Пин доступ все же для устройств, которые всегда с тобой. И только на короткое время выпускаются из вида.
Если же все таки хочется его прикрутить, то свяжи с сессионной кукой.
Кука ставится например на несколько дней. Каждый запрос к бакенду обновляет поле lastAccessTime в таблице сессий. Тогда если прошло больше (условно 15 минут), то бакенд вместо запрошенной страницы отдает форму ввода пин кода. Совпал - обновляем поле. Нет - считаем попытки. Исчерпал удаляем эту сессию - редириктим на обычный логин.