Как открыть или создать общую ссылку для Документов Google по идентификаторам разрешений без учетной записи Google? - PullRequest
2 голосов
/ 19 июня 2019

У меня есть веб-приложение PHP, интегрированное с GoogleDriveAPI v3, которое создает папки на Google Диске, устанавливает различные разрешения для списка пользователей, показывает каждому пользователю содержимое папки, и пользователи должны иметь возможность получить доступ к файлам (что имеют те же права доступа к папке), открывая их в новом окне вне моего приложения, непосредственно в Google Docs. Эти пользователи могут не иметь учетной записи Google.

В моей базе данных хранится идентификатор папки, полученный с помощью Google Drive API, и идентификаторы разрешений, полученные при их установке.

Когда пользователи просматривают содержимое папки, мое приложение вызывает соответствующий API для получения списка файлов внутри папки (см. Здесь https://developers.google.com/drive/api/v3/reference/files/list), и я управляю ключом jView webViewLink, который является ссылкой на документ, но Я не знаю, как дать способ открыть файл непосредственно в Документах Google, передавая разрешения для тех пользователей, которые не имеют учетной записи Google.

Я попытался создать и опубликовать документ вне приложения, прямо в папке Google Drive, и получил электронное письмо со ссылкой, подобной этой: 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;

    }

Здесь я хотел бы открыть файл Документов Google

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

Я предполагаю, что, поскольку я могу открывать и изменять файл, когда я получаю ссылку по электронной почте, я могу создать такую ​​же ссылку для пользователей, чтобы открыть ее через мое приложение.

1 Ответ

0 голосов
/ 20 июня 2019

Вы говорите о ссылке, доступной для всех, у кого есть ссылка, поскольку вы сказали, что основное различие между этим способом и совместным использованием Документа Google с определенной учетной записью Google заключается в том, что если вы используете способ AnyWithTheLink , даже если вы войдете в свою учетную запись 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...