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();
- }
Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Пожалуйста, авторизуйтесь или зарегистрируйтесь
- Последние комментарии
- VP9 марта 2025 г. 16:14Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМ22 ноября 2024 г. 21:51Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
- Сейчас обсуждают на форуме
- f15 февраля 2025 г. 13:46Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
- Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.
Что у вас написано в SCOPE_MASK ? там есть упоминание о email ?
email - это отдельный scope, без этого разрешения вы не получите email
да, конечно SCOPE_MASK = "email"
Хорошо, значит остаётся лишь одно. Вы не там ищете email.
В официальной документации на VK API написано следующее:
Ознакомиться с документацией можно здесь VK API authcode
Поэтому пытаться найти email в запросе getProfileInfo может быть изначально бесполезно.
Вам нужно проверить, что возвращается в момент авторизации.
Если не запрашивать вообще никаких разрешений, то API вернёт это:
Если же запросить и email, то должно быть примерно так
В общем, если верить документации на QOAuth2AuthorizationCodeFlow После авторизации кроме токена через метод
Вам возможно стоит проверить ещё и экстра токены с помощью метода extraTokens
Полагаю, что там может быть email и всякая дополнительная шелуха.
Да, действительно, оказалось что почта к моему аккаунту была привязана, но ждала подтверждение, а я столько времени потратил впустую, когда проблема была в аккаунте, используя другой аккаунт, я получил email с помощью const QVariantMap tokens = this->extraTokens();
Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.