2026-08-22 18:19:13 +03:00
|
|
|
#pragma once
|
|
|
|
|
|
2026-09-01 22:25:23 +03:00
|
|
|
#include <QDateTime>
|
2026-08-22 18:19:13 +03:00
|
|
|
#include <QJsonObject>
|
|
|
|
|
#include <QObject>
|
|
|
|
|
#include <QString>
|
|
|
|
|
#include <functional>
|
|
|
|
|
|
|
|
|
|
class QNetworkAccessManager;
|
|
|
|
|
|
|
|
|
|
struct AuthResult
|
|
|
|
|
{
|
|
|
|
|
bool ok = false;
|
|
|
|
|
bool twoFactorRequired = false;
|
2026-09-01 22:25:23 +03:00
|
|
|
bool licenseMissing = false;
|
2026-08-22 18:19:13 +03:00
|
|
|
QString error;
|
|
|
|
|
|
2026-08-22 23:39:46 +00:00
|
|
|
QString playerName; // ${auth_player_name}
|
|
|
|
|
QString uuid; // ${auth_uuid}, hex без дефисов
|
|
|
|
|
QString accessToken; // ${auth_access_token}
|
|
|
|
|
QString clientToken; // ${clientid}
|
|
|
|
|
QString userType; // ${user_type}: legacy / msa / ELYBY
|
2026-09-01 22:25:23 +03:00
|
|
|
|
|
|
|
|
// Только для аккаунтов Microsoft.
|
|
|
|
|
QString refreshToken; // продлевает сессию без ввода пароля
|
|
|
|
|
QString xuid; // ${auth_xuid}
|
|
|
|
|
QDateTime expiresAt; // UTC-время, когда протухает accessToken
|
2026-08-22 18:19:13 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class AuthService : public QObject
|
|
|
|
|
{
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
using Callback = std::function<void(const AuthResult &)>;
|
|
|
|
|
|
|
|
|
|
explicit AuthService(QObject *parent = nullptr);
|
|
|
|
|
static AuthResult offline(const QString &nickname);
|
|
|
|
|
static QString generateClientToken();
|
|
|
|
|
|
|
|
|
|
void loginElyBy(const QString &login,
|
|
|
|
|
const QString &password,
|
|
|
|
|
const QString &clientToken,
|
|
|
|
|
const QString &accessToken,
|
|
|
|
|
Callback callback);
|
|
|
|
|
|
|
|
|
|
void loginElyByWithTotp(const QString &login,
|
|
|
|
|
const QString &password,
|
|
|
|
|
const QString &totp,
|
|
|
|
|
const QString &clientToken,
|
|
|
|
|
Callback callback);
|
|
|
|
|
|
2026-08-22 23:39:46 +00:00
|
|
|
void ensureAuthlibInjector(const QString &targetDir,
|
|
|
|
|
std::function<void(const QString &path, const QString &error)> callback);
|
2026-08-22 18:19:13 +03:00
|
|
|
|
|
|
|
|
signals:
|
|
|
|
|
void progress(const QString &message);
|
|
|
|
|
|
|
|
|
|
private:
|
2026-08-22 23:39:46 +00:00
|
|
|
void postJson(const QString &endpoint,
|
|
|
|
|
const QJsonObject &body,
|
|
|
|
|
std::function<void(int status, const QJsonObject &response, const QString &transportError)> handler);
|
2026-08-22 18:19:13 +03:00
|
|
|
|
|
|
|
|
void authenticate(const QString &login,
|
|
|
|
|
const QString &password,
|
|
|
|
|
const QString &clientToken,
|
|
|
|
|
Callback callback);
|
|
|
|
|
|
|
|
|
|
QNetworkAccessManager *m_network;
|
|
|
|
|
};
|