使用开发者密钥(而非OAuth2)与Google云存储API配合使用

3

我希望通过一些控制台命令将文件上传到谷歌云。据我的理解,不能使用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上传文件吗?


如果存储桶已经存在并允许公共提交(Bucket ACL中所有用户条目具有WRITER权限),则可以在未经身份验证的情况下上传文件。但是,这时您需要自己处理滥用问题。还有传统的HMAC身份验证支持,但它仅适用于XML API,而不是您上面提到的JSON API的URL / SDK。 - Nathan Herring
2个回答

3
“Invalid Credentials”错误表示您的“Authorization”标头在某种程度上无效,需要刷新您的OAuth 2.0访问令牌。鉴于API密钥不是有效的访问令牌,这可以解释该错误。您可能希望构建一个类似于“Authorization:Bearer ya29.xxxxxxxx”的标头,其中“ya29”等是访问令牌。php-sdk将代表您完成凭据交换。
第二个错误是因为很可能没有项目的项目ID为“temp”。这是一个小陷阱,因为您可以为项目分配“友好名称”,但该名称可以共享在许多项目中,而不是唯一的标识符。您必须使用命名的Project ID,或者如果您尚未为项目分配一个,则可以使用数字Project ID,在https://console.developers.google.com/中查看URL时可见。

授权头以某种方式无效,您需要刷新OAuth 2.0访问令牌 - 在此查询之前,我可以在没有用户身份验证的情况下获取此令牌吗? - Alex
如果你想代表用户行事,可以暂时不这样做。如果你想以服务账户的身份行事,那么你可以通过使用已签名的JWT声明来授权一个服务账户;你需要服务账户的私钥,并且SDK也会帮助你完成这个过程。 - Nathan Herring

2

读写操作始终需要适当的身份验证和授权,即OAuth2令牌 (更多信息)。仅使用API密钥,您仅限于匿名只读API访问(前提是目标资源已标记为公共)。


严格来说,API密钥允许匿名API访问。底层API管理匿名访问应该发生的事情,并且可以设置GCS资源以允许匿名写入。但出于明显的滥用原因,这不是最佳实践。 - Nathan Herring

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