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 Т.Қ.

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

            Пікірлер

            Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
            Кіріңіз немесе Тіркеліңіз
            Г

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

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

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

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

            Qt - Тест 001. Сигналы и слоты

            • Нәтиже:52ұпай,
            • Бағалау ұпайлары-4
            Соңғы пікірлер
            G
            GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
            Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
            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 - вот это вопрос ))
            АК
            Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
            Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
            Енді форумда талқылаңыз
            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 приложения их можно выбрать. В чем может …
            BlinCT
            BlinCTМаусым 25, 2024, 1 Т.Ж.
            Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
            BlinCT
            BlinCTМамыр 5, 2024, 5:46 Т.Ж.
            Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
            Evgenii Legotckoi
            Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
            Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

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