使用谷歌云存储API与开发人员密钥(不是OAuth2)

时间:2014-07-07 10:16:40

标签: php google-api google-cloud-storage

我想从某些控制台命令将文件上传到谷歌云。据我所知,不能用OAuth2做,所以我需要使用Api键。但没有任何作用。我试过这个

$ch = curl_init();
$url = 'https://www.googleapis.com/upload/storage/v1/b/temp/o?uploadType=media&name=p11&key='.$this->key;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: key '.$this->key
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, '@/var/www/test.txt');
$content = curl_exec($ch);
var_dump($content);

有一个错误:

{ "error": { "errors": [ { "domain": "global", "reason": "authError", "message": "Invalid Credentials", 
  "locationType": "header", "location": "Authorization" } ],
  "code": 401, "message": "Invalid Credentials" } }

我试过php-sdk

$client = new Google_Client();
$client->setApplicationName("alasdg");
$client->setDeveloperKey($this->key);
$client->setScopes(['https://www.googleapis.com/auth/devstorage.read_write']);
$client->getAuth();

$storageService = new Google_Service_Storage($client);
$buckets = $storageService->buckets->listBuckets('temp');
var_dump($buckets);exit;

错误是:

Error calling GET https://www.googleapis.com/storage/v1/b?project=temp&key=afJwBJWucqvIU: (400) Invalid argument.

我可以上传没有OAuth2的文件吗?

2 个答案:

答案 0 :(得分:3)

Invalid Credentials错误表示您的Authorization标头在某种程度上无效,您需要刷新OAuth 2.0访问令牌。鉴于API密钥不是有效的访问令牌,这可以解释它。你可能想构建一个看起来像Authorization: Bearer ya29.xxxxxxxx的标题,其中" ya29"等等是访问令牌。凭证交换由php-sdk代表您完成。

您遇到的第二个错误,因为很可能没有项目ID为" temp"的项目。它有点像一个问题,因为你可以指定一个友好的名字"到您的项目,但该名称可以在许多项目之间共享,而不是唯一的标识符。您必须使用指定的项目ID,或者,如果您尚未为项目ID分配,则可以使用数字项目ID,当您在https://console.developers.google.com/中查看时,该ID可在URL中看到

答案 1 :(得分:2)

读写操作始终需要正确的身份验证和授权,即OAuth2令牌(more info)。只使用API​​密钥,您将被限制为匿名只读API访问(假定目标资源被标记为公共)。