我正在尝试构建一个网页,用户可以使用Google Picker从Google云端硬盘中选择图像,并使用PHP脚本将所选文件下载到我的服务器。
我设法设置了Picker,我得到了fileID,但是当我将这些ID传递给我的后端并尝试GET方法时,我收到了身份验证错误。
我花了两天时间研究和研究,但更多的是我阅读谷歌官方文档,我更加困惑。
有人可以告诉我,或者链接我的例子如何实现这个?是否有可能以某种方式将oAuthv2令牌从GooglePicker传递到我的PHP后端,然后将该令牌与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."
}
答案 0 :(得分:4)
在致电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 :(得分:1)
@pinoyyid说了一切,并且受到他的启发,这是我提出的实际解决方案:
如果您要下载文件,则需要两个变量 - oAuthToken
和fileId
function handleAuthResult(authResult) {
if (authResult && !authResult.error) {
oauthToken = authResult.access_token;
oauthToken; // <-- THIS IS THE Bearer token
createPicker();
}
}
当用户选择文件时,你会得到{p> 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
答案 2 :(得分:0)
您将刷新令牌存储在数据库中。检查API调用时,当前令牌是否仍然有效。如果不是,则使用刷新令牌
检索新的访问令牌