Php 使用具有开发者密钥的google云存储api(非OAuth2)

Php 使用具有开发者密钥的google云存储api(非OAuth2),php,google-api,google-cloud-storage,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_s

我想上传文件到谷歌云从一些控制台命令。正如我正确理解的那样,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的情况下上载文件吗?

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

无效凭据错误意味着您的
授权
头在某种程度上无效,您需要刷新OAuth 2.0访问令牌。考虑到API密钥不是有效的访问令牌,这就可以解释它了。您可能希望构造一个类似于
授权:承载ya29.xxxxxxxx
的头,其中“ya29”等是一个访问令牌。凭证交换由php sdk代表您完成


第二个错误是因为很可能没有项目ID为“temp”的项目。这有点难,因为你可以给你的项目分配一个“友好的名字”,但是这个名字可以在很多项目中共享,并且不是唯一的标识符。您必须使用命名的项目ID,或者,如果尚未分配项目ID,则可以使用数字项目ID,当您在

中查看时,该ID在URL中可见。严格来说,API键允许匿名API访问。底层API控制匿名访问应该发生什么,可以设置GCS资源以允许匿名写入。但是,由于明显的滥用原因,这不是最佳做法。授权标头在某种程度上无效,您需要刷新OAuth 2.0访问令牌-在此查询之前,我可以在没有用户身份验证的情况下获取此令牌吗?如果您想充当用户,现在不行。如果您想充当服务帐户,那么您可以使用签名的JWT断言来授权服务帐户;你需要服务帐户的私钥,SDK也会帮你。如果bucket已经存在并且允许公开提交,你可以在不进行身份验证的情况下上传文件(bucket ACL,其条目alluser具有WRITER权限)。然而,你要自己负责处理虐待行为。还有遗留的HMAC身份验证支持,但这只适用于XML API,而不适用于您上面提到的URL/SDK的JSON API。