M
Marsel16 августа 2023 г. 7:24

OAuth2.0 через VK, получение email

QOAuth2AuthorizationCodeFlow, OAuth2, VK

Разбираюсь довольно большое количество времени с OAuth через вк, используя QOAuth2AuthorizationCodeFlow и застрял на вопросе получения email пользователя, разобрался с тем как получать всю остальную информацию о пользователе, но как получить почту не могу понять, в документации просто нет информации об этом, неужели это не предусмотренно VK API?
Вот мой тестовый код, тут я получаю имя и фамилию пользоватея и его screen_name, читал на каком-то форуме, что email возвращается VK вместе с токеном, поэтому попробовал с помощью QObject::connect(this->replyHandler(), &QAbstractOAuthReplyHandler::replyDataReceived, this, &VkOAuth2::onReplyDataReceived); получить QByteArray с ответом от Vk, но email там нет, только токен и id пользователя, подскажите, кто работал с VK API, как получить почту пользователя?

VkOAuth2::VkOAuth2(QObject *parent)
    : QOAuth2AuthorizationCodeFlow{parent}
{
    auto replyHandler = new QOAuthHttpServerReplyHandler(REDIRECT_URI.port(), qApp);
    setReplyHandler(replyHandler);
    setAccessTokenUrl(TOKEN_URL);
    setAuthorizationUrl(AUTH_URL);
    setClientIdentifier(CLIENT_ID);
    setClientIdentifierSharedKey(CLIENT_SECRET);
    setScope(SCOPE_MASK);
    QObject::connect(this, &QOAuth2AuthorizationCodeFlow::authorizeWithBrowser, &QDesktopServices::openUrl);
    //Сигнал granted излучается при успешной авторизации

    QObject::connect(this->replyHandler(), &QAbstractOAuthReplyHandler::replyDataReceived, this, &VkOAuth2::onReplyDataReceived);
    //this->replyHandler()->replyDataReceived();
    QObject::connect(this, &QOAuth2AuthorizationCodeFlow::replyDataReceived, this, &VkOAuth2::onReplyDataReceived);

    QObject::connect(this, &QOAuth2AuthorizationCodeFlow::granted, [this]() {
        const QUrl getEmail{ "https://api.vk.com/method/account.getProfileInfo" };
        const QString token = this->token();
        //qDebug() << token;
        //Vk требует указывать версию API в параметрах запроса. Укажем 5.131
        auto network_reply = get(getEmail, { { "fields", "screen_name" }, { "v", 5.131 } });
        QObject::connect(network_reply, &QNetworkReply::finished, [network_reply] {
            //Ответ будет удалён позже, когда отработают все связанные
            //с ним сигнально-слотовые соединения,
            //поэтому такое удаление безопасно
            network_reply->deleteLater();

            QJsonDocument response = QJsonDocument::fromJson(network_reply->readAll());
            //qDebug() << response;
        });
    });
    this->grant();

}
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

5
Evgenii Legotckoi
  • 16 августа 2023 г. 8:39

Что у вас написано в SCOPE_MASK ? там есть упоминание о email ?
email - это отдельный scope, без этого разрешения вы не получите email

    M
    • 16 августа 2023 г. 9:34

    да, конечно SCOPE_MASK = "email"

      Evgenii Legotckoi
      • 16 августа 2023 г. 12:47
      • (ред.)

      Хорошо, значит остаётся лишь одно. Вы не там ищете email.

      В официальной документации на VK API написано следующее:

      Если у пользователя указан email, а приложением были запрошены соответствующие права, сервер также вернет email пользователя.

      Ознакомиться с документацией можно здесь VK API authcode

      Поэтому пытаться найти email в запросе getProfileInfo может быть изначально бесполезно.

      Вам нужно проверить, что возвращается в момент авторизации.

      Если не запрашивать вообще никаких разрешений, то API вернёт это:

      {
        "access_token": "533bacf01e11f55b536a565b57531ac114461ae8736d6506a3",
        "expires_in": 43200,
        "user_id": 66748
      }
      

      Если же запросить и email, то должно быть примерно так

      {
        "access_token": "533bacf01e11f55b536a565b57531ac114461ae8736d6506a3",
        "expires_in": 43200,
        "user_id": 66748,
        "email": "example@example.com"
      }
      

      В общем, если верить документации на QOAuth2AuthorizationCodeFlow После авторизации кроме токена через метод

      const QString token = this->token();
      

      Вам возможно стоит проверить ещё и экстра токены с помощью метода extraTokens

      const QVariantMap tokens = this->extraTokens();
      

      Полагаю, что там может быть email и всякая дополнительная шелуха.

        M
        • 16 августа 2023 г. 14:18
        • (ред.)
        • Ответ был помечен как решение.

        Да, действительно, оказалось что почта к моему аккаунту была привязана, но ждала подтверждение, а я столько времени потратил впустую, когда проблема была в аккаунте, используя другой аккаунт, я получил email с помощью const QVariantMap tokens = this->extraTokens();

          M
          • 16 августа 2023 г. 14:26

          Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

            Комментарии

            Только авторизованные пользователи могут публиковать комментарии.
            Пожалуйста, авторизуйтесь или зарегистрируйтесь
            d
            • dsfs
            • 26 апреля 2024 г. 10:56

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Результат:80баллов,
            • Очки рейтинга4
            d
            • dsfs
            • 26 апреля 2024 г. 10:45

            C++ - Тест 002. Константы

            • Результат:50баллов,
            • Очки рейтинга-4
            d
            • dsfs
            • 26 апреля 2024 г. 10:35

            C++ - Тест 001. Первая программа и типы данных

            • Результат:73баллов,
            • Очки рейтинга1
            Последние комментарии
            k
            kmssr9 февраля 2024 г. 0:43
            Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
            АК
            Анатолий Кононенко5 февраля 2024 г. 7:50
            Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
            EVA
            EVA25 декабря 2023 г. 16:30
            Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
            J
            JonnyJo25 декабря 2023 г. 14:38
            Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
            G
            Gvozdik19 декабря 2023 г. 3:01
            Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
            Сейчас обсуждают на форуме
            G
            Gar22 апреля 2024 г. 11:46
            Clipboard Как скопировать окно целиком в clipb?
            DA
            Dr Gangil Academics20 апреля 2024 г. 13:45
            Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
            a
            a_vlasov14 апреля 2024 г. 12:41
            Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
            Павел Дорофеев
            Павел Дорофеев14 апреля 2024 г. 8:35
            QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
            f
            fastrex4 апреля 2024 г. 10:47
            Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

            Следите за нами в социальных сетях