M
MarselТам. 16, 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, 2:18 Т.Қ.
        • (өңделген)
        • Жауап шешім ретінде белгіленді.

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

          M
          • Там. 16, 2023, 2:26 Т.Қ.

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

            Пікірлер

            Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
            Кіріңіз немесе Тіркеліңіз
            m
            • molni99
            • Қаз. 26, 2024, 1:37 Т.Ж.

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

            • Нәтиже:80ұпай,
            • Бағалау ұпайлары4
            m
            • molni99
            • Қаз. 26, 2024, 1:29 Т.Ж.

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

            • Нәтиже:20ұпай,
            • Бағалау ұпайлары-10

            C++ - Тест 003. Условия и циклы

            • Нәтиже:42ұпай,
            • Бағалау ұпайлары-8
            Соңғы пікірлер
            Evgenii Legotckoi
            Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
            Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
            A
            ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
            Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
            ИМ
            Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
            Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
            d
            dblas5Шілде 5, 2024, 11:02 Т.Ж.
            QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
            k
            kmssrАқп. 8, 2024, 6:43 Т.Қ.
            Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
            Енді форумда талқылаңыз
            9
            9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
            Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
            Evgenii Legotckoi
            Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
            добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
            F
            FynjyШілде 22, 2024, 4:15 Т.Ж.
            при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

            Бізді әлеуметтік желілерде бақылаңыз