php对任何人或特定域的Google Drive API(团队驱动器)文件权限

时间:2018-10-12 14:21:49

标签: php permissions google-drive-api google-drive-team-drive

Google API explorer上,我尝试在drive.permissions.create中提供正确的fileId。我将supportTeamDrives设置为true,并使用角色:读者和类型:任何人来请求正文。这只是给我一个错误:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "invalidLinkVisibility",
    "message": "Bad Request. User message: \"\""
   }
  ],
  "code": 400,
  "message": "Bad Request. User message: \"\""
 }
}

在我的PHP代码中也是如此。这是我所能找到的最接近的位置:

...
$userPermission     = new Google_Service_Drive_Permission( array(
                'type'          => 'anyone',
                'role'          => 'reader',
            ));
            $service->permissions->create( $imageId, $userPermission, array(
                'supportsTeamDrives'    => true,
            ));
...

我找不到任何有关该错误的信息:

invalidLinkVisibility

我需要做的是将文件夹中20-50个文件的权限临时设置为“公开”(即,知道链接的任何人都可以看到),因为我正在发送webContentLink(或webViewLink,我还没有) t知道我需要使用哪一个)到另一个API上载图像。完成此操作后,我想删除公共访问权限。 一种选择是将文件夹的权限(具有递归公共访问权限)设置为公共访问权限。我只是不知道如何在PHP中使用Google Drive API更改(或添加)文件权限。

一种替代方法是,如果有某种方法可以通过包含令牌的URL通过图像获取图像,例如

$source     = $files.$image1;
$context    = stream_context_create( array(
    'https' => array(
        'header'  => 'Authorization: Bearer '. $token
    )
) );
$image = file_get_contents( $source, false, $context );

其中$ token是验证服务的身份验证令牌,$ files是https://drive.google.com/a/file/d/,而$ image1是文件的ID。当然,在尝试此操作时,我必须先登录我的Google帐户,因为我将使用另一个API调用这些链接并将内容发布到其他服务,所以该帐户将无法使用。有什么办法可以使这项工作吗?这样,我就不必担心文件权限(后退)。

1 个答案:

答案 0 :(得分:1)

您需要先删除旧的权限对象,该对象通常具有默认的初始ID:10933160239610460256k(当我尝试通过分析GDrive前端与后端的交互来找出解决方案时,我找到了此ID)

$service->permissions->delete($file->id, '10933160239610460256k',array('supportsTeamDrives'=>true));

然后创建一个这样的新权限

$Permission = new \Google_Service_Drive_Permission(array(
    'type' => 'anyone',
    'role' => "reader",
    'additionalRoles' => [],
    'withLink' => true,
    'value' =>'YOUR_TEAM_DRIVE_DOMAIN' 
          ));
$service->permissions->create(
        $file->id, $Permission, array('fields' => 'id','supportsTeamDrives'=>true));