В данном гайде будет приведен самый простой пример авторизации с помощью логина и пароля от аккаунта без привязки к HWID. Весь материал из гайда можно расширять в любых направлениях, в каких позволяет ваша фантазия Для создания многопользовательской авторизации понадобится: Интернет-хостинг ( в моем случае это http://beget.com/ ) База данных MySQL ( берем из хостинга ) Проект C++ I. Настраиваем базу данных MySQL Не буду здесь расписывать абсолютно все моменты ( оплата хостинга / создание базы данных ) это уже слишком, не хочу лить воду в этом гайде, перейдем к настройке. После того как мы создали свою базу данных, нам нужно настроить таблицу базы данных ( на данном скриншоте users - это таблица, у вас будет чисто, нажмите на "Новая" что-бы создать новую таблицу в базе данных ) Поскольку авторизация будет включать в себя только логин и пароль от аккаунта, нам нужно создать два столбца, назовем их соответственно login и password Вы можете сами ознакомиться с определением типа VARCHAR, дабы я здесь не расписывал это. Длину нашего логина и пароля поставим в 32 символа для примера ( вы можете использовать любую длину строки ) Остальные параметры нам не особо важны, если у вас есть желание, вы можете ознакомиться с ними сами Далее нажимаем кнопку "Сохранить" справа внизу ( не забываем назвать нашу таблицу сверху в поле "Имя таблицы", я назову test ). II. Пишем PHP скрипт для работы с базой данных Создаем файл index.php ( в нем мы будем писать всю логику скрипта для работы с MySQL таблицей ) Подключаемся к нашей базе данных: <?php $mysqli = new mysqli('127.0.0.1', 'Имя базы данных', 'Пароль от базы данных', 'Имя базы данных повторно'); ?> Из-за того что наш php скрипт будет лежать на том же хостинге, где хранится наша база данных, в подключении мы используем локальный IP адрес. Наш скрипт будет принимать данные с помощью GET запросов от клиента ( проекта C++ ) по этому создадим сразу три переменные, которые будут заполняться GET-запросом: <?php $login = $_GET['login']; $password = $_GET['password']; $api = $_GET['api']; $mysqli = new mysqli('127.0.0.1', 'Имя базы данных', 'Пароль от базы данных', 'Имя базы данных повторно'); ?> Переменная $api служит направляющей переменной нашего скрипта ( для того что бы обращаться к определенному блоку, давайте будем думать что блок 0 - регистрация, блок 1 - авторизация ) Далее создадим новую переменную - $sql_query, она будет содержать статус нашего запроса для базы данных. Сразу же напишем первый запрос: добавление логина и пароля в базу данных ( т.е регистрация, блок 0 ) <?php $login = $_GET['login']; $password = $_GET['password']; $api = $_GET['api']; $mysqli = new mysqli('127.0.0.1', 'Имя базы данных', 'Пароль от базы данных', 'Имя базы данных повторно'); switch($api) { case 0: $sql_query = $mysqli->query( "INSERT INTO `test`(`login`, `password`) VALUES ('$login', '$password')" ); break; } ?> Мы можем проверить правильность написанного кода, ведь GET-запрос это просто правильно сформированная ссылка. Давайте выведем success если наш блок кода отработал: <?php $login = $_GET['login']; $password = $_GET['password']; $api = $_GET['api']; $mysqli = new mysqli('127.0.0.1', 'Имя базы данных', 'Пароль от базы данных', 'Имя базы данных повторно'); switch($api) { case 0: $sql_query = $mysqli->query( "INSERT INTO `test`(`login`, `password`) VALUES ('$login', '$password')" ); print("success!"); break; } ?> После запроса c помощью GET метода, мы увидим, что в нашей базе данных заполнились поля login и password с нашими данными Arkting Piere Далее напишем авторизацию, по факту это просто проверка наличия данных в нашей таблице ( пишем в блоке 1 ) <?php $login = $_GET['login']; $password = $_GET['password']; $api = $_GET['api']; $mysqli = new mysqli('127.0.0.1', 'Имя базы данных', 'Пароль от базы данных', 'Имя базы данных повторно'); switch($api) { case 0: $sql_query = $mysqli->query( "INSERT INTO `test`(`login`, `password`) VALUES ('$login', '$password')" ); $api_response = "Success registration!"; break; case 1: $sql_query = $mysqli->query( "SELECT `login` FROM `test` WHERE `password` = '$password'" ); if ( $sql_query->num_rows != 0 ) { $api_response = "Success auth!"; break; } break; } print($api_response); ?> Проверка $sql_query->num_rows != 0 означает, что SELECT смог найти хотя бы 1 строку наших GET данных, означая, что пользователь зарегистрирован. Он выбирает поле login где password равен введенному паролю. Переменная $api_response хранит в себе обычный ответ от скрипта. Как же теперь это связать с проектом C++? Приступим. III. Пишем клиент на C++ Для чтения ответа от php скрипта мы воспользуемся таким методом: std::string CreateUrlRequest(std::string url) { std::string request_data = ""; HINTERNET open = InternetOpenA(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); if (!open) return request_data; HINTERNET http_session = InternetConnectA(open, "Ваш URL адрес хостинга", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, NULL); if (!http_session) { InternetCloseHandle(open); return request_data; } HINTERNET http_request = HttpOpenRequestA(http_session, "GET", url.c_str(), NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_RELOAD, 0); if (!http_request) { InternetCloseHandle(open); InternetCloseHandle(http_session); return request_data; } char request[0x1000] = { 0 }; std::string headers = "Content-Type: text/html\r\nUser-Agent: license"; if (!HttpSendRequestA(http_request, headers.c_str(), headers.size(), request, url.size())) { InternetCloseHandle(open); InternetCloseHandle(http_session); InternetCloseHandle(http_request); return request_data; } char buffer[0x1000] = { 0 }; DWORD read = 0; while (InternetReadFile(http_request, buffer, sizeof buffer - 1, &read) && read) request_data.append(buffer, read); InternetCloseHandle(open); InternetCloseHandle(http_session); InternetCloseHandle(http_request); return request_data; } Далее дело за малым, считать информацию после нашего GET запроса с помощью выше написанной функции. Приступим. В нашей базе данных уже хранится логин: Arkting пароль: Piere, давайте напишем авторизацию для этих данных. int main() { std::string login, password, response; std::cout << "Введите ваш логин: "; std::cin >> login; std::cout << "Введите ваш пароль: "; std::cin >> password; response = CreateUrlRequest( "/index.php?api=1&login=" + std::string( login ) + "&password=" + std::string( password ) ); printf( "%s\n", response ); } Теперь если мы введем верные данные, в консоли выведет Success auth! Далее дело за вами, развивайте данный код как только можно. Удачи!