【问题标题】:How to authenticate with GitHub using Qt and Access Token如何使用 Qt 和访问令牌向 GitHub 进行身份验证
【发布时间】:2020-11-09 22:22:16
【问题描述】:

我尝试使用访问令牌从我的 Qt 应用程序实现 GitHub 身份验证。通过提供 URL(在我的例子中是 https://api.github.com/notifications)和我在 GitHub 上生成的访问令牌(Settings/Developer settings/Personal access tokenshttps://github.com/settings/tokens,我可以使用 Postman 毫无问题地连接到 GitHub。现在我想使用 Qt 做同样的事情,但找不到如何做到这一点的示例。 Qt 文档中有 Reddit(https://doc.qt.io/qt-5/qtnetworkauth-redditclient-example.html) 的示例,但它使用了一些重定向算法,而不是访问令牌:

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"));

我不知道如何使用提供的访问令牌来做同样的事情。

【问题讨论】:

    标签: qt github


    【解决方案1】:

    如果您要使用个人令牌,则无需实现 OAuth/OAuth2 逻辑,因为事务的第一部分是获取令牌但 OP 已经拥有它。如果你有令牌,那么只需要请求其余的 API:

    #include <QByteArray>
    #include <QCoreApplication>
    #include <QJsonDocument>
    #include <QNetworkAccessManager>
    #include <QNetworkReply>
    #include <QTimer>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        const QString username = "<username>";
        const QString token = "<token>";
    
        const QByteArray basic_authorization = QByteArray("Basic ") + (username + ":" + token).toUtf8().toBase64();
    
        QNetworkRequest request;
        request.setRawHeader(QByteArrayLiteral("Authorization"), basic_authorization);
        QUrl url("https://api.github.com/notifications");
        request.setUrl(url);
    
        QNetworkAccessManager manager;
        QNetworkReply *reply = manager.get(request);
        QObject::connect(reply, &QNetworkReply::finished, [reply](){
            QJsonDocument doc = QJsonDocument::fromJson(reply->readAll());
            qDebug() << doc;
            QTimer::singleShot(1000, &QCoreApplication::quit);
        });
    
        return a.exec();
    }
    

    【讨论】:

    • 谢谢@eyllanesc,它按预期工作。我错误地认为我应该使用QNetworkAccessManager::authenticationRequired 插槽来提供凭据,但这不起作用。如通知here 支持基本身份验证,因此我将使用您的解决方案。
    猜你喜欢
    • 2014-02-11
    • 2023-03-20
    • 1970-01-01
    • 2020-05-24
    • 2019-11-29
    • 2018-04-18
    • 2012-10-18
    • 2017-04-11
    • 2023-01-29
    相关资源
    最近更新 更多