为啥我从 google drive rest api 得到服务器回复被禁止?

Posted

技术标签:

【中文标题】为啥我从 google drive rest api 得到服务器回复被禁止?【英文标题】:Why am I getting server replied forbidden from google drive rest api?为什么我从 google drive rest api 得到服务器回复被禁止? 【发布时间】:2018-09-05 09:04:23 【问题描述】:

我的目标:

我正在尝试将我的 Qt 桌面应用程序与谷歌驱动器连接。现在我的目标很简单,即从我的驱动器中获取所有文件的列表(以 JSON 形式)

到目前为止我做了什么。

我已经按照本教程Connecting your Qt application with Google Services using OAuth 2.0 为它创建了我自己的包装类。在调用 grant() 函数之前,我已经执行了所有步骤。范围是https://www.googleapis.com/auth/drive。到目前为止一切正常。

我使用了从QOAuthHttpServerReplyHandler 发出的信号tokensReceived 并存储了access_token。所以简而言之,我能够验证我的应用程序并获取访问令牌。现在对我来说下一步是执行一个简单的获取请求。这就是我所做的

void Google_Drive::Send_Request()

    QNetworkRequest request(QUrl("https://www.googleapis.com/drive/v3/files"));
    request.setRawHeader("Authorization", QByteArray("Bearer ")+mAccessToken);
    mManager.get(request);

我遇到的错误:

我收到的回复是

“传输https://www.googleapis.com/drive/v3/files时出错 - 服务器回复:禁止”

请让我知道我错过了什么或者我做错了什么。另外,如果需要任何其他详细信息,请告诉我。谢谢!

编辑 1: 这次回复接收方法我readAll()而不是仅仅阅读errorString(),我发现api没有打开。所以我从开发者控制台打开了 api。现在我在设置之后现在我得到errorString()

“传输https://www.googleapis.com/drive/v3/about时出错- 服务器回复:错误请求”

reply->readAll()返回

"\n \"error\": \n \"errors\": [\n \n \"domain\": \"全局\",\n \"原因\": \"必填\",\n \"消息\": \" 此方法需要 'fields' 参数。\",\n \"locationType\": \"参数\",\n \"location\": \"fields\"\n \n ],\n \"code\": 400,\n \"message\": \"'fields'参数是 此方法需要。\"\n \n\n"

编辑 2: 抱歉,为了测试我使用“https://www.googleapis.com/drive/v3/about”而不是“https://www.googleapis.com/drive/v3/files”的响应。现在纠正它工作正常。

【问题讨论】:

【参考方案1】:

禁止访问很可能意味着他们的访问令牌或您应用它的方式有问题。

最简单的测试方法就是这样做

https://www.googleapis.com/drive/v3/files?access_token=Yourtoken

您可以将其添加到您的代码中,也可以将其放入网络浏览器中,因为它是一个 http get 调用。

如果访问令牌有效,那么您就知道您应用授权标头的方式有问题。

QString headerData = "Bearer " + mAccessToken;
request.setRawHeader("Authorization", headerData.toLocal8Bit());

此方法需要 'fields' 参数。

这是 google drive api 中未记录的必填字段。您必须将 fields=* 与您的所有请求一起发送。

字段选择器指定要包含在响应中的字段子集。 有关详细信息,请参阅性能提示文档中的部分响应部分。 使用以获得更好的性能。

尝试添加这个

QNetworkRequest request(QUrl("https://www.googleapis.com/drive/v3/files?fields=*"));

【讨论】:

没问题,我通过你的测试确认了。 我猜将它设置为 QByteArray 可能是个坏主意。承载只是文本 我也试过了,同样的反应,请检查我的编辑 对不起这是我的错误,我使用了错误的请求检查我的编辑 2 fields=* 将帮助您取回完整的回复,如果您不添加它,您只会得到部分回复。如果对您有帮助,请记住接受答案。

以上是关于为啥我从 google drive rest api 得到服务器回复被禁止?的主要内容,如果未能解决你的问题,请参考以下文章

通过Google Drive REST API上传或创建包含内容的新文件?

如何将文件重命名为 google drive rest api?改造2

如何从 Google Drive 上传和下载文件(使用 Rest Api v3)

google drive simple upload rest API的示例

有人可以为 Google Drive REST API v3 提供最新的 Android 指南吗?

使用 Google Drive REST API 在 Swift 3 完成处理程序中避免向下转换