无法使用 QOAuth2AuthorizationCodeFlow 实现 Google 登录

2024-01-01

问题在于重定向 URI,我不知道将其设置为什么。有谁能够弄清楚这一点吗?

我收到错误Qt Creator's输出窗格如下所示:

qt.networkauth.oauth2: Unexpected call
qt.networkauth.replyhandler: Error transferring https://oauth2.googleapis.com/token - server replied: Bad Request

这是我的代码,一个名为grant()这将返回 true 打开成功的身份验证。辅助类OAuth2Props返回 Google 生成的 JSON 文件中的所有数据。

bool grant() {
  QOAuth2AuthorizationCodeFlow oauthFlow;
  QObject::connect(&oauthFlow,
                   &QOAuth2AuthorizationCodeFlow::authorizeWithBrowser,
                   &QDesktopServices::openUrl);

  oauthFlow.setScope("email");
  oauthFlow.setAuthorizationUrl(OAuth2Props::authUri());
  oauthFlow.setClientIdentifier(OAuth2Props::clientId());
  oauthFlow.setAccessTokenUrl(OAuth2Props::tokenUri());
  oauthFlow.setClientIdentifierSharedKey(OAuth2Props::clientSecret());
  QOAuthHttpServerReplyHandler oauthReplyHandler(
      QUrl(OAuth2Props::redirectUri()).port());
  oauthFlow.setReplyHandler(&oauthReplyHandler);

  QEventLoop eventLoop;
  QObject::connect(&oauthFlow, &QOAuth2AuthorizationCodeFlow::granted,
                   &eventLoop, &QEventLoop::quit);
  oauthFlow.grant();
  eventLoop.exec();

  return true;
}

对我做错了什么有什么想法吗?我设置的重定向 URIhttp://127.0.0.1:65535/,我猜我做错了什么?

Update:

  1. 以下代码正在运行,我遇到问题的原因是因为在获得授权一次后,我再次运行代码,并且由于我已经获得授权,所以我收到了此错误。

  2. 创建一个实例可能会更好QOAuth2AuthorizationCodeFlow在堆上,就像 @Chilarai 在他的示例代码中所做的那样。因为我们不想要我们的QOAuth2AuthorizationCodeFlow无论如何都会超出范围,因为我们将需要它来提出进一步的请求。

  3. 这里另一个重要的注意事项是连接到QOAuthHttpServerReplyHandler::tokensReceived信号,以便获取与您的 Google 服务进一步交互所需的令牌。

  4. 稍后可以通过 Google REST Api 测试令牌是否仍然有效,如果您想与Google Drive你可以试试这个answer https://stackoverflow.com/questions/52181208/why-am-i-getting-server-replied-forbidden-from-google-drive-rest-api建议。


我很难调试它。但是,我意识到,如果您转到 Google 控制台并将重定向 URI 设置为http://127.0.0.1:some_port/代替http://localhost:some_port/

记得最后加“/”

它神奇地起作用了。休息这里是我的代码

    this->google = new QOAuth2AuthorizationCodeFlow(this);
        this->google->setScope("email");

        connect(this->google, &QOAuth2AuthorizationCodeFlow::authorizeWithBrowser, &QDesktopServices::openUrl);

        this->google->setAuthorizationUrl(QUrl("https://accounts.google.com/o/oauth2/auth"));
        this->google->setClientIdentifier(CLIENT_ID);
        this->google->setAccessTokenUrl(QUrl("https://oauth2.googleapis.com/token"));
        this->google->setClientIdentifierSharedKey(CLIENT_SECRET);

// In my case, I have hardcoded 5476 to test
        auto replyHandler = new QOAuthHttpServerReplyHandler(5476, this);
        this->google->setReplyHandler(replyHandler);
        this->google->grant();


        connect(this->google, &QOAuth2AuthorizationCodeFlow::granted, [=](){
            qDebug() << __FUNCTION__ << __LINE__ << "Access Granted!";

            auto reply = this->google->get(QUrl("https://www.googleapis.com/plus/v1/people/me"));
            connect(reply, &QNetworkReply::finished, [reply](){
                qDebug() << "REQUEST FINISHED. Error? " << (reply->error() != QNetworkReply::NoError);
                qDebug() << reply->readAll();
            });
        });

有关其余代码的详细信息,请参阅此如何使用 Qt oauth 创建登录页面? https://stackoverflow.com/questions/48453550/how-to-create-a-login-page-using-qt-oauth/62382316#62382316

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用 QOAuth2AuthorizationCodeFlow 实现 Google 登录 的相关文章

  • C# 打印问题(RichTextBox)

    我想打印我的 RichTextBox eintragRichTextBox 的内容 我现在有这个代码 private void druckenPictureBox Click object sender EventArgs e PrintD
  • 将 new 与 decltype 一起使用

    T t T is an implementation detail t new T want to avoid naming T to allow for flexibility t new decltype t error cannot
  • linq 中使用字符串数组 c# 的 'orderby'

    假设我有一个这样的方法定义 public CustomerOrderData GetCustomerOrderData string CustomerIDs var query from a in db Customer join b in
  • 在 C# 中调用 C++ 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有很多用 C 编写的库 我想从 C 调用这些库 但是 我遇到了很多问题 我想知道是否有书籍或指南告诉我如何做到这一点 Dll导入 htt
  • 如何使用 SOAP 且不使用 WSE 在 .NET 中签署 Amazon Web 服务请求

    亚马逊产品广告 API 以前称为 Amazon Associates Web Service 或 Amazon AWS 实施了一项新规则 即自 2009 年 8 月 15 日起 向其发送的所有 Web 服务请求都必须经过签名 他们在其网站上
  • C# 5 async/await 线程机制感觉不对?

    为什么让调用线程进入异步方法直到内部 等待 一旦调用异步方法就生成一个线程 这不是更干净吗 这样您就可以确定异步方法会立即返回 您不必担心在异步方法的早期阶段没有做任何昂贵的事情 我倾向于知道某个方法是否要在 我的 线程上执行代码 不管是堵
  • 在 omp 并行 for 循环中使用 unique_ptr 会导致 SEG.FAULT

    采取以下代码 include
  • 使用 LINQ 更新 IEnumerable 对象的简单方法

    假设我有一个这样的业务对象 class Employee public string name public int id public string desgination public int grade List
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • 根据对象变量搜索对象列表

    我有一个对象列表 这些对象具有三个变量 ID 名称和值 这个列表中可能有很多对象 我需要根据ID或Name找到一个对象 并更改值 例子 class objec public string Name public int UID public
  • C#6 中的长字符串插值行

    我发现 虽然字符串插值在应用于现有代码库的字符串 Format 调用时非常好 但考虑到通常首选的列限制 字符串对于单行来说很快就会变得太长 特别是当被插值的表达式很复杂时 使用格式字符串 您将获得一个可以拆分为多行的变量列表 var str
  • 在 asp.net MVC 中使用活动目录进行身份验证

    我想使用活动目录对我的 asp net mvc 项目中的用户进行身份验证 在网上冲浪了几个小时后 我没有找到任何对我有用的东西 我已经看到了所有结果 但什么也没有 我尝试按照许多帖子的建议编辑我的 web config 如果有人可以帮助我提
  • 如何使用 NPOI 按地址(A1、A2)获取 Excel 单元格值

    我有一个 Excel 单元格地址 例如 A1 A2 如何使用 C 中的 NPOI 框架以编程方式访问此单元格 我找到的一些 Java POI 示例代码 CellReference cr new CellReference A1 row my
  • Project Euler #8,我不明白我哪里出了问题[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在做项目欧拉第八题 https projecteuler net problem 8 其中我得到了这个大得离谱的数字 7316
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • 逆向工程 ASP.NET Web 应用程序

    我有一个 ASP NET Web 应用程序 我没有源代码 该 bin 包含 10 个程序集和一个 compiled 文件 我在 App Code dll 上使用 Reflector 它向我显示了类和命名空间之类的东西 但它太混乱了 有没有什
  • 如何在 winforms 应用程序的主屏幕显示之前显示欢迎屏幕?

    我想在应用程序启动时加载欢迎屏幕 然后用户单击欢迎屏幕上的按钮 然后关闭欢迎屏幕 最后显示主屏幕 static void Main startup method being called Application EnableVisualSt
  • 需要提取字符串中点后的最后一个数字,如“7.8.9.1.5.1.100”

    我需要提取 C 字符串中最后一个点后面的最后一个数字 例如 7 8 9 1 5 1 100 并将其存储在整数中 Added 该字符串也可以是 7 8 9 1 5 1 1 或 7 8 9 1 5 1 0 我还想验证它在最后一个点之前恰好是 7
  • 通过 Tab 键浏览 XML 文档字段

    In VB NET you can move through the fields in the XML member documentation with the Tab key 这在 C 中不起作用 还有其他方法吗 除了用鼠标将光标放在
  • 使用未分配的局部变量

    我遇到了一个错误 尽管声明了变量 failturetext 和 userName 错误仍然出现 谁能帮帮我吗 Use of Unassigned local variable FailureText Use of Unassigned lo

随机推荐

  • 输出具有多个工作表的单个 Excel 文件

    Talend Open Studio for Data Integration 中是否有一个组件能够输出单个 Excel 文件 但其中包含 2 个单独的工作表 我想将原始文件中的一些列分隔到另一个工作表中 并将另一组列分隔到第二个工作表中
  • 使用 ksoap2-android 订阅共享点 Web 服务时出现身份验证错误

    我正在编写一个Android应用程序 它将使用sharepoint 2010中lists amx服务的getlist 方法 我正在使用kso ap2 android来处理我的soap消息 当我尝试进行身份验证时 出现预期的 xmlpullp
  • AlarmManager 阻塞主线程

    我已经实现了一个调用服务的 AlarmManager 问题是 虽然我在 AsyncTask 中启动它 但它阻塞了主线程 这是我的 AsyncTask 的来源 private class NotificationsServiceTask ex
  • 按最大大小将 numpy 数组拆分为块

    我有一些very大型二维 numpy 数组 一个数据集有 55732 x 257659 个元素 超过 140 亿个元素 因为有些操作我需要执行 throwMemoryErrors 我想尝试将数组分割成一定大小的块 然后针对这些块运行它们 我
  • 我们可以在 Android 中通过用户的电话号码找到用户吗?

    Android 中是否可以通过用户的电话号码找到用户 如果可以向用户发送短信 那么我们还可以检索或了解发送短信的用户的位置 我的意思是是否可以对以下功能进行编程 应用程序发送短信到用户的手机 应用程序在用户的手机上接收来自短信发送者的短信
  • C++ 中的字符指针

    我对 C 中的字符指针有疑问 每当我们在 C 中创建字符指针时 char p How are you doing p 应该包含保存值 how are you getting 的内存位置的地址 但是 我对示例代码和输出感到困惑 为什么cout
  • 在Unity3d中使用Android陀螺仪,如何将初始相机旋转设置为初始移动设备旋转?

    我想使用Android陀螺仪在Unity3d的标准第一人称控制器上执行头部跟踪 我创建了一个简短的脚本 用于旋转第一人称控制器的父节点和相机子节点 该脚本附在相机上 这个脚本运行得很好 它根据我的移动设备的移动旋转第一人称视图 但是 只有当
  • Django + docker + 周期性命令

    使用 docker docker compose 运行 Django 时 运行定期 计划任务 如 manage py custom command 的最佳实践是什么 FE最常见的情况 manage py 清除会话 https docs dj
  • 在 Laravel Eloquent 中使用“With()”函数获取特定列

    我有两张桌子 User and Post One User可以有很多posts和一个post只属于一个user In my User型号 我有一个hasMany关系 public function post return this gt h
  • 大整数转十六进制

    快速提问 我有一个愚蠢的长BigInteger我想将其作为十六进制字符串写入文件 我知道Java提供了 toString 16 方法可以做到这一点 但我在 C 中找不到等效的方法 我在用着System Numerics BigInteger
  • 使用 XTS 进行 Rbind。如何堆叠而不按索引日期排序

    我正在使用 Quantmod 来生成带有股票信息的 XTS 对象 并且我希望编译 堆叠一堆 XTS 文档来处理代码 将 Rbind 与 XTS 结合使用 我发现它不会将 XTS 堆叠在一起 而是按日期进行合并和排序 x lt xts 1 1
  • 确定表单上是否存在字段

    我有一个从数据库动态创建的表单字段 一系列复选框 因此表单上可能不存在该字段 如果数据库中没有匹配的值 我有一些代码需要根据字段是否存在来执行 并提取所选值 如果存在 不过 我似乎无法让 javascript 承认该字段的存在 这是我尝试过
  • 当应用程序处于打瞌睡模式时,警报管理器触发的 Android 通知不会触发

    我有以下要求 用户需要能够在我的应用程序中安排定期提醒 以便在某个时间触发推送通知exact每天的时间 这是我希望我最终不会提交的问题之一 因为在撰写本文时推荐了类似的问题 然而 一些团队成员花了很多时间浏览 Android 开发人员文档和
  • 使用 Cakephp 3 用户名或电子邮件登录

    我想使用用户名或电子邮件登录 所以我想动态更改 Auth 字段 如何像 Cakehp 2 那样修改 this gt Auth 字段 在 cakephp 2 中你可以这样做 this gt Auth gt authenticate array
  • Java 7 -> Java 8:AES 导致异常:“BadPaddingException:给定的最终块未正确填充”与 BufferedReader 和 ZipStreams 结合使用

    我们使用以下语句实例化密码 Cipher cipher Cipher getInstance AES SecretKeySpec key new SecretKeySpec cipherKey AES 这适用于 java 7 1 7 45
  • 如何从子组件显示应用程序级别的警报

    我想要一些规则或建议来做到这一点 我有一个应用程序级别的警报 我想在我的组件之一发生某些情况时显示该警报 例如 保存信息已成功或失败 另外 如何发送我想要显示的不同文本 有 ViewChild 的等价物吗 感谢您的帮助 我会这样做Obser
  • 从 django list_filter 中删除重复项

    我在 django admin 中对相关对象中的字段使用列表过滤器 class A models Model pass class B models Model fk models ForeignKey A val models CharF
  • 当单元格结果按公式更改时运行宏

    我需要什么 每当单元格 C3 返回与当前不同的值 基于其公式 而不是基于手动键入不同的值 时 我们将要触发的宏称为 MacroRuns 我花了一整天的时间阅读并尝试了关于这个主题的谷歌搜索的前两页上的每个 解决方案 到目前为止 似乎没有什么
  • 使用 cassandra 而不是 memcache?

    我不断地从不同来源查阅那些大型网站正在从 memcache 切换到 cassandra 的文章 由于我有 mySQL 背景 当我试图比较彼此之间的优缺点时 我会有点头疼 你能帮我了解更多这方面的信息吗 替换 memcached 是愚蠢的作为
  • 无法使用 QOAuth2AuthorizationCodeFlow 实现 Google 登录

    问题在于重定向 URI 我不知道将其设置为什么 有谁能够弄清楚这一点吗 我收到错误Qt Creator s输出窗格如下所示 qt networkauth oauth2 Unexpected call qt networkauth reply