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(); }
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.Do you like it? Share on social networks!
- Akiv Doros
- Nov. 12, 2024, 1:58 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:50points,
- Rating points-4
- molni99
- Oct. 26, 2024, 11:37 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:80points,
- Rating points4
- molni99
- Oct. 26, 2024, 11:29 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:20points,
- Rating points-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();
Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.