+ проверка срока жизни токена
This commit is contained in:
+101
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user