Рабочий процесс OAuth без URL перенаправления в QT - PullRequest
0 голосов
/ 04 марта 2020

У меня есть настольное приложение QT. Я хочу реализовать рабочий процесс OAuth, используя встроенную функциональность QT. Я запустил пример redditclient, предоставленный QT. Это требует, чтобы мы предоставили URL перенаправления, который в приведенном ниже примере:

enter image description here

Есть ли способ получить код авторизации без показа этого перенаправления URL? Поскольку у меня есть приложение для настольного компьютера, не знаете, какой URL перенаправления будет в моем случае?

1 Ответ

0 голосов
/ 06 марта 2020

Необходимо использовать браузер или аналогичные средства для аутентификации и принятия разрешений приложения. Если вы не хотите использовать браузер, тогда вы можете использовать QWebEngineView, и чтобы показать пример, я буду опираться на официальный пример Qt Reddit Example :

Так что измените его так, чтобы вы не делали не использовать QDesktopServices :: openUrl (), но QWebEngineView:

redditwrapper.h

// ...
private:
    QOAuth2AuthorizationCodeFlow oauth2;
    bool permanent = false;
    QWebEngineView browser;
};

redditwrapper. cpp

// ...
RedditWrapper::RedditWrapper(QObject *parent) : QObject(parent)
{
    auto replyHandler = new QOAuthHttpServerReplyHandler(1337, this);
    oauth2.setReplyHandler(replyHandler);
    oauth2.setAuthorizationUrl(QUrl("https://www.reddit.com/api/v1/authorize"));
    oauth2.setAccessTokenUrl(QUrl("https://www.reddit.com/api/v1/access_token"));
    oauth2.setScope("identity read");

    connect(&oauth2, &QOAuth2AuthorizationCodeFlow::statusChanged, [=](
            QAbstractOAuth::Status status) {
        if (status == QAbstractOAuth::Status::Granted)
            emit authenticated();
    });
    oauth2.setModifyParametersFunction([&](QAbstractOAuth::Stage stage, QVariantMap *parameters) {
        if (stage == QAbstractOAuth::Stage::RequestingAuthorization && isPermanent())
            parameters->insert("duration", "permanent");
    });

    connect(&oauth2, &QOAuth2AuthorizationCodeFlow::authorizeWithBrowser, [this](const QUrl & url){
        browser.resize(640, 480);
        browser.load(url);
        browser.show();
    });
    connect(&browser, &QWebEngineView::urlChanged, [replyHandler, this](const QUrl & url){
        if(url.adjusted(QUrl::RemoveQuery) == QUrl(replyHandler->callback())){
            qDebug() << url;
            browser.close();
        }
    });
}
// ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...