Qt6连接Google Drive时遇qt.networkauth.oauth2: Unexpected call错误求助
Qt6连接Google Drive OAuth2报错的排查方案
1. 修正code编码的反向操作错误
你当前在RequestingAccessToken阶段对code做了解码处理,但实际上Qt的QOAuth2AuthorizationCodeFlow在请求token时会自动对参数做URL编码。手动解码后再传入,反而会导致code中的特殊字符(如/、+)被二次编码,引发服务器识别异常。
直接删除这段解码逻辑:
else if (stage == QAbstractOAuth::Stage::RequestingAccessToken) { // 移除此处的code解码代码 }
2. 核对Google Cloud控制台配置
- 重定向URI必须匹配:Qt的
QOAuthHttpServerReplyHandler使用的是http://localhost:<PORT>/,要确保这个URI已经添加到Google Cloud控制台的OAuth 2.0客户端ID设置中,端口号要和代码里的<PORT>完全一致。 - 客户端密钥/ID无错误:检查
<CLIENT>和<SECRET>是否复制正确,不要包含多余空格或换行符。 - 启用Drive API:在Google Cloud控制台的API库中搜索并启用Google Drive API,否则即使OAuth授权通过,后续操作也会失败。
3. 绑定自定义网络管理器
你的代码创建了m_networkAccessManager但没有绑定到google对象上,Qt会使用默认网络管理器,可能存在代理或配置问题。添加以下代码:
this->google->setNetworkAccessManager(m_networkAccessManager);
4. 排查SSL证书支持问题
Google API使用HTTPS,Qt需要正确加载SSL库才能建立连接。可以通过以下代码验证环境是否支持SSL:
qDebug() << "OpenSSL支持状态:" << QSslSocket::supportsSsl(); qDebug() << "OpenSSL版本:" << QSslSocket::sslLibraryVersionString();
如果不支持,需要安装对应版本的OpenSSL库(Windows下为libssl-1_1.dll和libcrypto-1_1.dll,Linux下为系统OpenSSL包),并确保Qt能找到这些库文件。
5. 替换为新版OAuth授权端点
将旧的授权URL替换为Google推荐的新版端点,避免兼容性问题:
this->google->setAuthorizationUrl(QUrl("https://accounts.google.com/o/oauth2/v2/auth"));
内容的提问来源于stack exchange,提问作者Chilarai
相关产品推荐
相关产品推荐

