如何在没有Google帐户的情况下通过权限ID打开或生成Google文档的共享链接?

时间:2019-06-19 11:06:24

标签: php google-drive-api google-docs-api

我有一个与GoogleDriveAPI v3集成的PHP Web应用程序,它可以在Google云端硬盘上创建文件夹,为用户列表设置不同的权限,向每个用户显示文件夹内容,并且用户应该能够访问文件(拥有与文件夹相同的权限)直接在Google文档中在我的应用程序外部的新窗口中打开它们。这些用户可能没有Google帐户。

在我的数据库中,我存储了Google Drive API获得的文件夹ID和设置权限后获得的权限ID。

当用户查看文件夹内容时,我的应用程序调用相关的API来获取文件夹内的文件列表(在此处https://developers.google.com/drive/api/v3/reference/files/list进行解释),然后我管理webViewLink json密钥,该密钥是文档的链接,但是我不知道如何允许直接在Google文档中打开文件的方式,而不给那些没有Google帐户的用户传递权限。

我试图直接在Google云端硬盘文件夹中创建和共享应用程序之外的文档,但是我收到了一封包含以下链接的电子邮件: https://docs.google.com/document/d/xxxxxx-file-id/edit?usp=sharing_eip&ts=5d03b1c1注意:由于保留的内容,我无法发布正确的链接。 通过打开链接,即使我没有以Google帐户身份登录(我的昵称显示为动物),我也可以修改文档,因此Google知道打开链接可以编辑文件。

   //create Folder
   public function createRootFolder($name, $folder_root)
   {
        $fileMetadata = new Google_Service_Drive_DriveFile(array(
            'name' => $name,
            "parents" => [$folder_root],
            'mimeType' => 'application/vnd.google-apps.folder'));
             $file = $this->service->files->create($fileMetadata, array(
            'fields' => 'id'));
        return $file;
    }

    //setPermission
    public function setPermission($folderId, $typePermission = 'user' , 
    $rolePermission , $emailAddress)
    {
        $return = false;
        $this->service->getClient()->setUseBatch(true);
        try {
            $batch = $this->service->createBatch();

            $userPermission = new Google_Service_Drive_Permission(array(
                'type' => $typePermission,
                'role' => $rolePermission,
                'emailAddress' => $emailAddress,
                'setDisplayName' => $emailAddress
            ));
            $request = $this->service->permissions->create(
                $folderId, $userPermission, array('fields' => 'id')
            );
            $batch->add($request, 'user');

            $results = $batch->execute();

            foreach ($results as $result) {
                if ($result instanceof Google_Service_Exception) {
                    $return = null;
                } else {
                    $return =  $result->id ;
                }
            }
        } finally {
            $this->service->getClient()->setUseBatch(false);
        }
        return $return;
    }

   //getFileList
    public function getFileList($folderId=null)
    {
        $l = [];
        $optParams = array(
            'fields' => '*',
            'q' => '\''.$folderId.'\' in parents'
        );

        $response = $this->service->files->listFiles($optParams);
        $ll = [];
        foreach ($response->files as $file) {
            array_push($l,
                array(
                    'id'=>$file->id,'name'=>$file->name,
                    'modifiedTime'=>$file->modifiedTime,
                    'createdTime'=> $file->createdTime,
                    'webViewLink' => $file->webViewLink
                ));

            array_push($ll ,array('file', $file));
        }


        return $l;

    }

在这里,我想打开Goog​​le文档文件

<a href="https://docs.google.com/document/d/xxxxxx-file-id/edit">Apri</a> 

我希望,当我通过电子邮件收到链接时可以打开和修改文件,因此我可以生成相同的链接供用户通过我的应用程序打开它。

1 个答案:

答案 0 :(得分:0)

您所说的是每个人都可以访问的链接,正如您所说的,这种方式与与特定的Google帐户共享Google文档之间的主要区别在于,如果您使用 anyoneWithTheLink ,即使您使用Google帐户登录,您也将是匿名的,这意味着您所做的编辑将以匿名的形式出现[1]。

如果要获取此可编辑链接,则必须使用以下$userPermission变量,而不要使用[2]:

$userPermission = new Google_Service_Drive_Permission(array(
                'type' => ’anyone’,
                'role' => ‘writer’,
                ‘allowFileDiscovery’ => false //If true, the link will be discoverable in internet
            ));

您可以对每个文件使用一次setPermission方法,因此它们都具有可共享链接,任何具有链接的人都可以编辑该链接。

[1] https://support.google.com/drive/answer/2494822?hl=en&co=GENIE.Platform=Desktop

[2] https://developers.google.com/drive/api/v3/reference/permissions/create