使用服务帐户使用 Google Drive API 创建文件不会在授权用户帐户的 GD 上呈现文件
Creating a file with Google Drive API using a Service Account doesn't render file on authorized user account's GD
我目前正在尝试创建一个文件,并使用 Google 提供的服务帐户身份验证方法将其上传到 Google 云端硬盘帐户(因为它将全部在服务器端在最终产品上,我不希望用户必须授权访问,所以没有 OAuth per-say)。
我目前可以连接到服务帐户并上传文件,但是当我浏览我的 Google 驱动器时文件没有显示。
(我能够使用 OAuth 方法让它工作(上传和呈现);我会在上传之前手动授权应用程序,所以我很确定代码正在工作)
此外,我知道它的另一种工作方式是,上传完成后,我会返回一个文件 ID。如果我去“https://drive.google.com/file/d/FILE_ID/view?usp=sharing”,我会遇到“需要授权”。
创建服务帐户时我应该做些什么,以便我的 Gmail 帐户可以访问这些文件?
有关信息,这是我连接到 API(服务器端)的方式:
<?php
$client = new Google_Client();
if ($this->oauth_credentials = $this->getServiceAccountCredentialsFile()) :
$client->setAuthConfig($this->oauth_credentials);
endif;
if ($this->warning != null) :
echo $this->warning;
return;
endif;
$client->setApplicationName("Test Google Drive Service Account");
$client->setScopes(['https://www.googleapis.com/auth/drive']);
$service = new Google_Service_Drive($client);
define("TESTFILE", ABSPATH.'testfile-small.txt');
if (!file_exists(TESTFILE)) {
$fh = fopen(TESTFILE, 'w');
fseek($fh, 1024 * 1024);
fwrite($fh, "!", 1);
fclose($fh);
}
$file = new Google_Service_Drive_DriveFile();
$result = $service->files->create(
$file,
array(
'data' => file_get_contents(TESTFILE),
'mimeType' => 'application/octet-stream',
'uploadType' => 'media'
)
);
echo '<pre>'; var_dump($result->id); echo '</pre>';
如果您希望服务帐户代表其他用户行事而不先征求他们的同意,您必须:通过 G Suite 管理员,为服务帐户启用 Domain-Wide-Delegation。
否则,服务帐户需要至少征求一次用户同意,并存储访问和刷新令牌,因为当令牌过期时,它可以无限期地使用 Google 服务器刷新它。
更多信息请点击此处:https://developers.google.com/admin-sdk/directory/v1/guides/delegation
你有四个选择...
- 不要使用服务帐户。只需为用户帐户存储一个刷新令牌。请参阅 How do I authorise an app (web or installed) without user intervention?。服务帐户是服务器访问的唯一选择是一个神话。
- 使用服务帐户写入已由您的用户帐户共享到服务帐户的文件夹
- 使用服务帐户写入您的服务帐户与您的用户帐户共享的文件夹
- 使用 G-Suite 域中的服务帐户来模拟用户帐户
选项 1 是最简单的,选项 2 和选项 3 仅在谁拥有文件方面有所不同,因此根据谁的配额计算文件。 4 仅与 G-Suite
相关
我目前正在尝试创建一个文件,并使用 Google 提供的服务帐户身份验证方法将其上传到 Google 云端硬盘帐户(因为它将全部在服务器端在最终产品上,我不希望用户必须授权访问,所以没有 OAuth per-say)。
我目前可以连接到服务帐户并上传文件,但是当我浏览我的 Google 驱动器时文件没有显示。
(我能够使用 OAuth 方法让它工作(上传和呈现);我会在上传之前手动授权应用程序,所以我很确定代码正在工作)
此外,我知道它的另一种工作方式是,上传完成后,我会返回一个文件 ID。如果我去“https://drive.google.com/file/d/FILE_ID/view?usp=sharing”,我会遇到“需要授权”。
创建服务帐户时我应该做些什么,以便我的 Gmail 帐户可以访问这些文件?
有关信息,这是我连接到 API(服务器端)的方式:
<?php
$client = new Google_Client();
if ($this->oauth_credentials = $this->getServiceAccountCredentialsFile()) :
$client->setAuthConfig($this->oauth_credentials);
endif;
if ($this->warning != null) :
echo $this->warning;
return;
endif;
$client->setApplicationName("Test Google Drive Service Account");
$client->setScopes(['https://www.googleapis.com/auth/drive']);
$service = new Google_Service_Drive($client);
define("TESTFILE", ABSPATH.'testfile-small.txt');
if (!file_exists(TESTFILE)) {
$fh = fopen(TESTFILE, 'w');
fseek($fh, 1024 * 1024);
fwrite($fh, "!", 1);
fclose($fh);
}
$file = new Google_Service_Drive_DriveFile();
$result = $service->files->create(
$file,
array(
'data' => file_get_contents(TESTFILE),
'mimeType' => 'application/octet-stream',
'uploadType' => 'media'
)
);
echo '<pre>'; var_dump($result->id); echo '</pre>';
如果您希望服务帐户代表其他用户行事而不先征求他们的同意,您必须:通过 G Suite 管理员,为服务帐户启用 Domain-Wide-Delegation。
否则,服务帐户需要至少征求一次用户同意,并存储访问和刷新令牌,因为当令牌过期时,它可以无限期地使用 Google 服务器刷新它。
更多信息请点击此处:https://developers.google.com/admin-sdk/directory/v1/guides/delegation
你有四个选择...
- 不要使用服务帐户。只需为用户帐户存储一个刷新令牌。请参阅 How do I authorise an app (web or installed) without user intervention?。服务帐户是服务器访问的唯一选择是一个神话。
- 使用服务帐户写入已由您的用户帐户共享到服务帐户的文件夹
- 使用服务帐户写入您的服务帐户与您的用户帐户共享的文件夹
- 使用 G-Suite 域中的服务帐户来模拟用户帐户
选项 1 是最简单的,选项 2 和选项 3 仅在谁拥有文件方面有所不同,因此根据谁的配额计算文件。 4 仅与 G-Suite
相关