Почему я получаю плохой запрос от Google? - PullRequest
0 голосов
/ 03 октября 2018

Моя цель
Обмен токена обновления на токен доступа от Google с помощью OAuth 2.

Мой код

bool Google_Account::Refresh_Access_Token_Using_Refresh_Token()
{  
    // Prepare Url
    QUrl url(tr("https://www.googleapis.com/oauth2/v4/token"));

    // Create request
    QNetworkRequest request(url);
    request.setRawHeader("Host:","www.googleapis.com");
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");

    // Create request body ClientID, ClientSecret, RefreshTokenString are class data members
    QString RequestBody = tr("client_secret=%1&").arg(ClientSecret) +
                          tr("grant_type=refresh_token&")+
                        tr("refresh_token=%1&").arg(RefreshTokenString)+
                          tr("client_id=%1").arg(ClientID);

    QByteArray array = RequestBody.toUtf8();

    // Get reply
    QNetworkReply *reply = mQNAM.post(request, array); // mQNAM is QNetworkAccessManager

    // Set timeout to reply while waiting for reply finished
    bool stop = false;
    QTimer timer;
    timer.setSingleShot(true);

    QObject::connect(&timer, &QTimer::timeout, [&](){
        qDebug()<<"Time out";
        stop = true;
    });
    timer.start(5000);

    // Wait till the response is completed
    while(!reply->isFinished()){
        QCoreApplication::processEvents();
        if(stop){
            qDebug()<<"Going to abort";
            reply->abort();
        }
    }

    // Check for reply
    if(reply->isFinished()){

        if(reply->error() != QNetworkReply::NoError){
            qDebug()<<reply->readAll();
            emit setMessage("Error: "+reply->errorString());
            delete reply;
            return false;
        }
        else{
            QByteArray array = reply->readAll();
            QJsonDocument document = QJsonDocument::fromJson(array);
            QJsonObject obj = document.object();
            access_token = obj.value("access_token").toString(); //access_token is class data variable
            delete reply;
            return true;
        }
    }
    else{
        delete reply;
        return false;
    }
}

Проблема заключается в том, что если язапустите этот код на моем компьютере с Windows 7 (Qt 5.11.1), все в порядке, я получаю токен доступа, но если я запускаю на своем Raspberry Pi (Rasbian Qt 5.7), я получаю ошибку 400, Плохой запрос от Google.Я попытался использовать access_token, полученный с моего компьютера с Windows, и сделал другой запрос, например, получить список файлов с Google Drive, они нормально работают в Raspberry, но только у меня возникла проблема.Что я делаю неправильно?PS код подвергается рефакторингу только для конкретных деталей, в действительности я получаю идентификатор клиента и другие ключи от QSettings

...