【问题标题】:Not able to access my google drive Files with service account无法使用服务帐户访问我的谷歌驱动器文件
【发布时间】:2014-02-21 01:46:38
【问题描述】:

我想创建一个应用程序,它可以将文件添加到谷歌驱动器并将该文件共享给其他用户说 abc@gmail.com。此用户 abc@gmail.com 应登录到应用程序,然后他可以查看并下载其驱动器中的所有可用文件。目前我已经为此使用了谷歌驱动器的服务帐户。我可以将文件上传到谷歌驱动器,我可以将其分享给用户 abc@gmail.com。但我面临以下问题。

  1. 使用电子邮件 xyz@gmail.com 我注册了驱动器并创建了一个项目,但是当我使用驱动器 API 创建一个文件并将其共享给用户 abc@gmail.com 时,该文件未在 xyz@ 驱动器上列出gmail.com,但是当我尝试通过 API 访问它时,我可以看到文件。

  2. 对于用户 abc@gmail.com,共享文件在他的驱动器中可用,我可以看到,当我通过网络访问他的驱动器时,但当我尝试通过 API 访问它时,它显示没有文件。

请建议我哪里出错了。我是否可以这样做?

for user **xyz@gmail.com
$CLIENT_ID='xxxxxxxxx.apps.googleusercontent.com';
$SERVICE_ACCOUNT_EMAIL = 'xxxxxxxxxxxx@developer.gserviceaccount.com';
$SERVICE_ACCOUNT_PKCS12_FILE_PATH = 'xxxxxxxxxx-privatekey.p12';**

For user **abc@gmail.com
$CLIENT_ID='yyyyyyyyyyy.apps.googleusercontent.com';
$SERVICE_ACCOUNT_EMAIL = 'yyyyyyyyyyyy@developer.gserviceaccount.com';
$SERVICE_ACCOUNT_PKCS12_FILE_PATH = 'yyyyyyyyyyyy-privatekey.p12';**

我使用用户 xyz@gmail ID 创建了一个项目,并使用他上面的 clientID、帐户电子邮件、密钥文件创建了文件:

function insertFile($service, $title, $description, $parentId, $mimeType, $filename) {
        $file = new Google_DriveFile();
        $file->setTitle($title);
        $file->setDescription($description);
        $file->setMimeType($mimeType);
        // Set the parent folder.
        if ($parentId != null) {
            $parent = new ParentReference();
            $parent->setId($parentId);
            $file->setParents(array($parent));
        }
        try {
            $data = file_get_contents($filename);
            $createdFile = $service->files->insert($file, array(
                'data' => $data,
                'mimeType' => $mimeType,
                'convert' =>TRUE,
                    )
            );
            $fileID = $createdFile->getId();
            return $fileID;
        } catch (Exception $e) {
            print "An error occurred: " . $e->getMessage();
            exit();
        }
    }

使用以下代码将此文件共享给用户 abc@gmail.com:

function insertPermission($service, $fileId, $value='abc@gmail.com', $type = 'user', $role = 'writer') {
    $newPermission = new Google_Permission();
    $newPermission->setValue($value);
    $newPermission->setType($type);
    $newPermission->setRole($role);
    try {
        return $service->permissions->insert($fileId, $newPermission);
    } catch (Exception $e) {
        print "An error occurred: " . $e->getMessage();
    }
    return NULL;
}

然后检查 abc@gmail.com 的文件,我使用他的 clientID、accountEmail 和私钥文件登录,并检索我在代码下方使用的文件

function retrieveAllFiles($service) {
    $result = array();
    $pageToken = NULL;
    do {
        try {
            $parameters = array();
            if ($pageToken) {
                $parameters['pageToken'] = $pageToken;
            }
            $files = $service->files->listFiles($parameters);
            $result = array_merge($result, $files->getItems());
            $pageToken = $files->getNextPageToken();
        } catch (Exception $e) {
            print "An error occurred: " . $e->getMessage();
            $pageToken = NULL;
        }
    } while ($pageToken);
    return $result;
}

我认为我正在使用不同的 clientID、accountEmail 和私钥,因此文件没有列出到 abc@gmail.com 但如果我使用相同的 clientID、帐户电子邮件和私钥 xyz@gmail.com然后我会得到所有的文件。我想要的只是将一些文件共享给 abc@gmail.com,他应该只得到这些文件。

【问题讨论】:

  • 在下面查看我的答案。即使用户帐户创建了服务帐户,也不会赋予用户帐户对服务帐户文件的任何特殊权限。根据您在这里的目标,您可能首先使用服务帐户使事情变得过于复杂,您可以授权为实际用户。
  • 你能告诉我如何授权实际用户吗?我做了谷歌,但没有成功。

标签: php google-drive-api


【解决方案1】:
  1. 这是因为 xyz@gmail.com 不拥有该文件,也没有任何访问权限。服务帐户创建了文件,因此是所有者。您与 abc@gmail.com 共享了该文件,以便他们可以看到该文件,但您从未授予 xyz@gmail.com 对该文件的访问权限。 (xyz@gmail.com 创建服务帐户的事实在这里无关紧要,该文件明确归服务帐户所有,而不是 xyz@gmail.com)。

  2. 如果 abc@gmail.com 有权访问 UI 中的文件,则他们在通过 API 进行身份验证后应该有权访问。你能在这里展示你的代码吗?

【讨论】:

  • 我已经分享了代码和细节。请就此向我提出建议。
猜你喜欢
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 2019-10-12
  • 2015-03-30
相关资源
最近更新 更多