Залогинится суперпуперадмином, у которого будет секретная кнопочка, которая в localStorage запишет непонятную абракадабру. Далее логиниться суперпуперзаказчиком вместе с абракадаброй - если абракадабра пришла на сервер вместе с логин-паролем - ОК, иначе - "ой, что-то пошло не так".
Реализовать просто - в форме сделать hidden input, куда при загрузке формы авторизации скриптом записывать localStorage.getItem('supersecretabrakadabra') - если ее на данном компе в хранилище нет, то она и не дойдет до сервера.
Единственный минус такого решения - необходимость логиниться админом. Но идея может развиваться и дальше - к примеру, на сервере в БД юзеров добавить поле "привязан", если поле чистое, то при первом логине заказчика так же прописывается абракадабра в localStorage и передается на сервер, сервер в записывает ее в поле "привязан" и все следующие попытки залогиниться обламывает, если абракадабра не совпадает. Ну а о том, что абракадабра должна генериться каждый раз уникально, говорить, думаю, не стоит.
Дальше - больше. Заказчику можно предоставить две кнопки - "привязать" и "отвязать", первая будет просить сервер привязать к новой абракадабре, вторая - очистить поле "привязан", соответственно разрешить логин с другого устройства. Само собой, кнопка "отвязать" должна присутствовать только в случае уже существующей привязки. Тогда админа сервера для ручной очистки поля "привязан" придется дергать только в случае исключительных ситуаций, к примеру смерти винта на привязанной машине