Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Содержание
GitHub репозиторий: https://github.com/ilyaBykonya/TestQtQrAuthorization
Часть 1. Введение
Часть 2. Сервер
Введение
Представим, что у нас имеется некая автономная система (комп в подвале завода), в которой доступ к благам цивилизации интернету осуществляется посредством звонка дяде Васе, который должен срочно отложить все свои дела и пойти держать антенну, дабы смузихлёбы господа разработчики смогли, например, загрузить на эту систему обновления.
В общем, будем считать, что доступа к сети у нас нет. За исключением наличия китайского Wifi-модуля, способного создать нам точку доступа, и привязать к этой системе пару-тройку периферийных устройств. Этот модуль используется для одновременной работы нескольких людей: зарегистрировались, и пошли по своим делам, а доступ к данным в любой момент с телефона.
С одной стороны, такой расклад не очень удобен, с другой — мы можем считать, что получение физического доступ к такому компьютеру — дело неблагодарное, и никто посторонний к нему не притронется. А вот к его Wifi...
Проблема
Встаёт вопрос: как обеспечить безопасность сетевых запросов на данный агрегат. Вариантов, на самом-то деле, масса:
Public/private ключи. Тут всё как в ssh: ставим работягам на мобилки приватный ключ, на машину ставим публичный, и вуаля. Но для этого надо заранее синхронизировать работягу и систему. А это не очень удобно, если пользователей много.
Пароль. Ну это совсем нехорошо. У половины паролем будет 12345, у другой — дата рождения (себя, кота, мамы, папы, не важно). Да и менять их тоже ведь никто не будет.
Access token — вполне неплохо вариант. Скомпрометировать его сложнее, поскольку выдаётся он прямо при подключении, действует ограниченное время, и получается ограниченным способом.
В итоге, будем использовать именно доступ к ресурсам через токены. В качестве токенов для простоты будет uuid (потому что Qt умеет их генерить из коробки, и это в принципе не самый плохой вариант), жить он будет, скажем, сутки.
Получение token обычно происходит по https (например, через OAuth), но мы это будем делать посредством сканирования Qr-кода с монитора, выведенного куда-то в более удобное место. В принципе, особой разницы нет, важна лишь доверие к способу получения.
Что будет в статьях
Использование QtHttpServer из Qt6. Свершилось чудо, люди почти десяток лет ждали, и теперь мы имеем http-сервер из коробки. В принципе, штука хорошая, можно делать ручки, есть ssl-конфигурации, парсинг параметров, в общем, неплохо.
Нашёл либу для qr-кодов на Qt на основе liqrencode. Большая часть либ либо слишком близка к Си, либо очень коряво написана, но вот конкретно эта реализация с точки зрения кода мне показалась приятной. Сделал форк, пофиксил багу, и изменил линковку для qmake.
Организуем беспрепятственный доступ с доверенных устройств и временный токенезированный для остальных. Токены будут простыми uuid.
Ну, и, возможно, посмотрим, как можно сканировать Qr-код в приложении под Android, написанном на Qt.