+ проверка срока жизни токена

This commit is contained in:
2026-02-11 06:58:55 +03:00
parent 39f0c447c1
commit 47c0c7ed85
4 changed files with 130 additions and 8 deletions
+101
View File
@@ -591,3 +591,104 @@ void TTwAPI::parseBadgesFromApi(const QString &jsonString, QVector<ChatBadge> &b
badges.append(badge);
}
}
bool TTwAPI::validateTwitchToken(const QString &tokenName,
const QString &tokenValue,
int &daysValid)
{
daysValid = 0;
if (tokenValue.trimmed().isEmpty()) {
toLog(1, "TTwAPI::validateTwitchToken", "Пустой токен: " + tokenName);
return false;
}
QUrl url("https://id.twitch.tv/oauth2/validate");
QNetworkRequest request(url);
// Устанавливаем заголовки
request.setHeader(QNetworkRequest::UserAgentHeader, "YourApp/1.0");
request.setRawHeader("Accept", "application/json");
// Формируем заголовок Authorization
QString authHeader = "OAuth " + tokenValue;
request.setRawHeader("Authorization", authHeader.toUtf8());
// Отправляем GET запрос
QNetworkReply *reply = m_networkManager->get(request);
if (!reply) {
toLog(2, "TTwAPI::validateTwitchToken", "Не удалось создать запрос для токена: " + tokenName);
return false;
}
// Ожидание завершения запроса
QEventLoop loop;
QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
loop.exec();
// Проверяем статус ответа
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
QByteArray responseData = reply->readAll();
QString responseText = QString::fromUtf8(responseData);
// Обрабатываем ошибки сети
if (reply->error() != QNetworkReply::NoError) {
QString errorMsg = QString("Ошибка сети: %1 - %2")
.arg(reply->error())
.arg(reply->errorString());
toLog(2, "TTwAPI::validateTwitchToken", errorMsg);
reply->deleteLater();
return false;
}
reply->deleteLater();
// Обработка HTTP статусов
if (statusCode == 200) {
// Успешная валидация
QJsonDocument doc = QJsonDocument::fromJson(responseData);
if (!doc.isObject()) {
toLog(2, "TTwAPI::validateTwitchToken", "Ошибка парсинга JSON для токена: " + tokenName);
return false;
}
QJsonObject jsonObj = doc.object();
// Извлекаем expires_in (в секундах)
if (jsonObj.contains("expires_in") && jsonObj["expires_in"].isDouble()) {
int expiresInSeconds = jsonObj["expires_in"].toInt();
daysValid = qRound(expiresInSeconds / 86400.0); // Конвертируем секунды в дни
// Логируем информацию о токене
QString logMsg = QString("Токен '%1' действителен. Осталось: %2 дней. "
"Client ID: %3, Логин: %4")
.arg(tokenName)
.arg(daysValid)
.arg(jsonObj.value("client_id").toString("N/A"))
.arg(jsonObj.value("login").toString("N/A"));
toLog(0, "TTwAPI::validateTwitchToken", logMsg);
return true;
} else {
toLog(2, "TTwAPI::validateTwitchToken",
QString("В ответе отсутствует expires_in для токена: %1").arg(tokenName));
return false;
}
}
else if (statusCode == 401) {
// Невалидный токен
toLog(2, "TTwAPI::validateTwitchToken",
QString("Токен '%1' невалиден (HTTP 401)").arg(tokenName));
return false;
}
else {
// Другие HTTP ошибки
QString errorMsg = QString("HTTP %1 для токена '%2': %3")
.arg(statusCode)
.arg(tokenName)
.arg(responseText);
toLog(2, "TTwAPI::validateTwitchToken", errorMsg);
return false;
}
}