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
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.Вам це подобається? Поділіться в соціальних мережах!
- Akiv Doros
- 12 листопада 2024 р. 01:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50бали,
- Рейтинг балів-4
- molni99
- 26 жовтня 2024 р. 11:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80бали,
- Рейтинг балів4
- molni99
- 26 жовтня 2024 р. 11:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20бали,
- Рейтинг балів-10
Что у вас написано в 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();
Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.