使用Google选取器从Google Drive下载文件

4
我正在尝试建立一个网页,用户可以通过使用Google Picker从Google Drive选择图像,并使用PHP脚本将所选文件下载到我的服务器。我已经成功设置了Picker,并获得了文件ID,但是当我将这些ID传递给后端并尝试使用GET方法时,我会收到身份验证错误。我已经花费了两天的时间研究和工作,但是我阅读Google官方文档越多,就越感到困惑。有人能告诉我或链接示例如何实现此功能吗?是否可能以某种方式将来自GooglePicker的oAuthv2令牌传递到我的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."
 }

@mmorava,有进展了吗? - tim peterson
1
@timpeterson 是的,Pinnoyid指令使其工作。 - mmorava
3个回答

4
在调用GET方法之前,您必须设置一个包含最新访问令牌的授权头。
如果您想手动完成此操作,请按以下步骤执行:
1. 使用您的应用程序ID /客户端ID和范围请求权限。这将返回授权代码。 2. 使用授权代码请求刷新令牌和访问令牌。 3. 为将来使用存储刷新令牌。 4. 在HTTP头Authorization中设置访问令牌(类似于 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的情况下,该配额为零,因此会出现错误。

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 是用户选择文件时获取的。这是来自 Google 文档的一个示例:

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

1
你不知道你的 PHP curl 脚本为我解决了多大的麻烦。 - Adam McMahon
@AdamMcMahon 我知道,这就是为什么我把脚本放在这里的原因。花了一整天时间苦苦挣扎这几行代码 :) - Mārtiņš Briedis
适用于PDF文件,但对于mimeType为“application/vnd.google-apps.document”,我收到以下错误信息:{ "error": { "errors": [ { "domain": "global", "reason": "badRequest", "message": "Bad Request" } ], "code": 400, "message": "Bad Request" } } - Moos

0

您可以将刷新令牌存储在数据库中。每次 API 调用时,都会检查当前令牌是否仍然有效。如果无效,则使用刷新令牌获取新的访问令牌。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接