我们如何使用 google 驱动器 api 和 PHP 更新文件的权限?

How we can update the permissions of a file using google drive api with PHP?

我想使用 google 驱动器 api 和 PHP 更新我的用户权限。 我是这样做的-

        $Service = new Google_Service_Drive($Client);

        $OptParams = array(
            'fields' => '*'
            );
            $Reponse = $Service->files->get($FileId,$OptParams);

            foreach ($Reponse->getPermissions() as $PermissionValue) {
                $PermissionId = $PermissionValue->getId();
                $PermissionValue->setRole('reader');
                $result = $Service->permissions->update($FileId,$PermissionId,$PermissionValue);
            }
            return $result;

从上面的代码中我可以获得我的文件 ID 和权限 ID,但是它在更新方法时抛出了错误。我在更新文件的用户权限时在做什么。

我收到这个错误-

Fatal error: Uncaught Google\Service\Exception: { "error": { "errors": [ { "domain": "global", "reason": "fieldNotWritable", "message": "The resource body includes fields which are not directly writable." } ], "code": 403, "message": "The resource body includes fields which are not directly writable." } }

谁能告诉我我做错了什么或者我错过了什么?更新用户权限的正确方法是什么?

permissions get method returns a Permissions response 对象。此对象包含许多不可写的字段。

permissions update 方法使用 HTTP 补丁方法。这意味着它将尝试更新您发送的每个 属性,即使是那些不可写的。

因此,通过从获取权限方法加载 $PermissionValue 对象,您将填充到许多 属性es。

您应该创建一个新的权限对象,并且只设置您需要更新的内容。在这种情况下是角色。

$newPermission = new Google_Service_Drive_Permission();
$newPermission ->setRole('reader');
$result = $Service->permissions->update($FileId,$PermissionId,$newPermission );

问题:

您正在提供 Permissions returned by Files: get 中的所有属性。其中一些属性,例如 id 本身,是不可写的。

解决方案:

Permissions: update 使用补丁语义来更新权限,这意味着只有您直接提供的字段才会被更新;不需要提供像 id 这样的字段,因为不提供它们不会导致这些字段从更新的权限中删除。

因此,您应该只提供要更新的字段。在本例中,即 role。创建一个新的权限对象(参见Google_Service_Drive_Permission)并设置其角色:

foreach ($Response->getPermissions() as $PermissionValue) {
    $PermissionId = $PermissionValue->getId();
    $updatedPerm = new Google_Service_Drive_Permission();
    $updatedPerm->setRole("reader");
    $result = $Service->permissions->update($FileId,$PermissionId,$updatedPerm);
}

注:

对于与文件所有者相关的权限,这将失败,因为您不能在不转移所有权的情况下删除文件的所有者(参见方法文档中的参数 transferOwnership)。