无法使用服务帐户访问我的google驱动器文件

时间:2014-01-29 10:17:18

标签: php google-drive-api

我想创建一个应用程序,可以将文件添加到谷歌驱动器并将该文件共享给其他用户说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访问它时,它显示我没有文件。

  3. 请建议我哪里出错了。我可以这样做吗?

    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,他应该只获得那些文件。

1 个答案:

答案 0 :(得分:4)

  1. 那是因为xyz@gmail.com不拥有或无权访问该文件。服务帐户创建了文件,因此是所有者。您与abc@gmail.com共享该文件,以便他们可以看到该文件但您从未授予xyz@gmail.com访问该文件的权限。 (xyz@gmail.com创建服务帐户的事实在这里无关紧要,该文件由服务帐户明确拥有,而不是xyz@gmail.com)。

  2. 如果abc@gmail.com可以访问用户界面中的文件,则他们应该在通过API进行身份验证时具有访问权限。你能在这里展示你的代码吗?