Invalid grant issue with Google OAuth authentication in Qt
-
I'm developing a Qt application and I want to use Google authentication for it. I created a Google API as explained in the following link: https://blog.qt.io/blog/2017/01/25/connecting-qt-application-google-services-using-oauth-2-0/ but I have a problem with it. It doesn't work in many cases and I get ProtocolInvalidOperationError(302) error for https://accounts.google.com/o/oauth2/token request URL in
QOAuthHttpServerReplyHandler::networkReplyFinished(QNetworkReply *reply)
method of Qt class.Note that I override QOAuthHttpServerReplyHandler::networkReplyFinished(QNetworkReply *reply) to get this error, because it doesn't emit any signal in this case, and the return value for reply->readAll() is as below:
{ "error": "invalid_grant", "error_description": "Malformed auth code." }
My Login.cpp code is something as below:
Login::Login() { google = new QOAuth2AuthorizationCodeFlow; google->setScope("email"); google->setAuthorizationUrl("https://accounts.google.com/o/oauth2/auth"); google->setClientIdentifier(Utility::decrypt(encryptedClientId)); google->setAccessTokenUrl("https://accounts.google.com/o/oauth2/token"); google->setClientIdentifierSharedKey(Utility::decrypt(encryptedClientSecret)); connect(google, &QOAuth2AuthorizationCodeFlow::authorizeWithBrowser, &QDesktopServices::openUrl); connect(google,&QOAuth2AuthorizationCodeFlow::authorizationCallbackReceived,[=](const QVariantMap data){ QString code(data["code"].toString()); if(!code2.isEmpty()) { const QUrl redirectUri= "http://localhost:56413/cb"; QJsonObject postdata; postdata.insert("code",code); postdata.insert("client_id", Utility::decrypt(encryptedClientId)); postdata.insert("client_secret", Utility::decrypt(encryptedClientSecret)); postdata.insert("redirect_uri", redirectUri.toString()); postdata.insert("grant_type","authorization_code"); QString serviceURL = "oauth2/v4/token"; NetworkManager::GetInstance()->Post(postdata,serviceURL,"https://www.googleapis.com/",[=](int statusCode,int resultnumber, QJsonObject obj){ if (statusCode >= 200 && statusCode < 300) { // it's ok, do nothing } else { //show error } }); } }); } void Login::googleLoginButtonPressed() { int googlePort = 56413; if(replyHandler == nullptr) replyHandler = new QOAuthHttpServerReplyHandlerArio(googlePort, this); google->setReplyHandler(replyHandler); QObject::connect(replyHandler, &QOAuthHttpServerReplyHandler::tokensReceived, [=](const QVariantMap &map) { googleToken = map["id_token"].toString(); connect(google, &QOAuth2AuthorizationCodeFlow::granted, [=]() { auto reply = google->get(QUrl("https://www.googleapis.com/plus/v1/people/me")); connect_reply = connect(reply, &QNetworkReply::finished, [=]() { int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if (statusCode >= 200 && statusCode < 300) { //NOW register or login the user with email QJsonDocument jsonResponse = QJsonDocument::fromJson(reply->readAll().data()); email = jsonResponse.object().value("emails").toArray()[0].toObject().value("value").toString(); reply->deleteLater(); } else { //error } }); }); }); google->grant(); }
Also my Qt version is 5.9.1.
what's the problem?Thanks for your help.