4

我正在尝试构建一个网页,用户可以在该网页上使用 Google Picker 从 Google Drive 中选择图像,并使用 PHP 脚本将选定的文件下载到我的服务器。

我已经设法设置了 Picker,并且我得到了 fileID,但是当我将此 ID 传递给我的后端并尝试 GET 方法时,我得到一个身份验证错误。

我花了 2 天的时间来研究这个问题,但我越是阅读谷歌官方文档,我就越困惑。

有人可以告诉我,或链接我的示例如何实现吗?是否有可能以某种方式将 oAuthv2 令牌从 GooglePicker 传递到我的 PHP 后端,然后将该令牌与 GET 请求一起使用?

非常感谢您提前!

编辑:

这是我尝试 GET https://www.googleapis.com/drive/v2/files/SOME_FILE_ID时遇到的错误

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "dailyLimitExceededUnreg",
    "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.",
    "extendedHelp": "https://code.google.com/apis/console"
   }
  ],
  "code": 403,
  "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup."
 }
4

3 回答 3

4

在调用 GET 之前,您必须设置一个包含最新访问令牌的 Authorisation-Header。

如果您想手动执行此操作,步骤如下:-

  1. 使用您的 app-id/client-id 和范围请求权限。这将返回给您一个授权码。
  2. 使用授权码请求刷新令牌和访问令牌
  3. 存储刷新令牌以备将来使用
  4. 在 http 标头授权中设置访问令牌(类似于 Authorization: Bearer ya29.AHES6ZR3HQa9trJM_IQcgNlM0SI4FvLQFiQfcAZCWLobfpjqtGlT6A)
  5. 发出你的 GET

您可以通过点击https://developers.google.com/oauthplayground/来查看整个过程

或者,如果您的客户端应用程序已经有一个访问令牌,您可以将其与文件 ID 一起发送到您的服务器,您的服务器可以简单地将其直接设置到授权标头中。

您可以使用 PHP 库,例如。转到https://developers.google.com/drive/v2/reference/files/insert并向下滚动以查看 PHP 示例。无论您是手动构建 URL 还是使用库,这完全是您的选择。库的最大缺点是,如果出现问题,您确实需要了解并跟踪 http 以查看发生了什么,因此不妨从第一天开始学习并爱上它们。

“超出未经验证使用的每日限制”消息似乎让初学者(包括我在内)感到困惑。重要的部分是“未经身份验证的使用”,这意味着您尚未设置授权标头。Google API 对未经授权的使用(例如 URL 缩短器)设置了每日配额。在 Drive 的情况下,该配额为零,因此出现错误。

于 2013-09-03T06:22:13.453 回答
1

@pinoyyid 照原样说了一切,并受到他的启发,这是我想出的实际解决方案:

如果要下载文件,则需要两个变量 -oAuthTokenfileId

当用户进行身份验证时,您从 JS 客户端获得的 oAuthToken。如果您使用 google 文档 ( https://developers.google.com/picker/docs/ ) 中的示例,该函数如下所示:

function handleAuthResult(authResult) {
    if (authResult && !authResult.error) {
        oauthToken = authResult.access_token;
        oauthToken; // <-- THIS IS THE Bearer token
        createPicker();
        }
}

fileId您从用户选择文件时获得。同样,来自谷歌文档的修改示例:

function pickerCallback(data) {
    if (data[google.picker.Response.ACTION] == google.picker.Action.PICKED) {
        var doc = data[google.picker.Response.DOCUMENTS][0];
        alert('You picked fileId: ' + doc[google.picker.Document.ID]);
    }
}

可能您会将这些数据作为表单请求或通过 ajax 传递。来自后端的简单 cURL 调用以下载文件:

$oAuthToken = 'ya29.XXXXXXXXXXXXXXXXXXXXXXXXX-XXXXXXXXX-XXXXXXX-XXXXXX-X-XXXXXXXXXXXX-XXXX';
$fileId = '0B4zzcXXXXXXXXXXXXXXXXXXXXXX';

$getUrl = 'https://www.googleapis.com/drive/v2/files/' . $fileId . '?alt=media';
$authHeader = 'Authorization: Bearer ' . $oAuthToken ;


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $getUrl);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    $authHeader ,
]);

$data = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);

file_put_contents("destination-file.jpg", $data);

关于文件下载的文档:https ://developers.google.com/drive/web/manage-downloads

于 2015-08-24T07:04:26.183 回答
0

您将刷新令牌存储在数据库中。检查 API 调用时,当前令牌是否仍然有效。如果不是,则使用刷新令牌检索新的访问令牌

于 2013-09-01T20:22:40.880 回答