Права доступа к файлам API Google Диска (совместный диск) в php для любого или определенного домена

В Google Обозреватель API Я попытался указать правильный идентификатор файла в drive.permissions.create. Я установил для 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, я не понял какой из них мне нужно использовать еще) в другой API, чтобы загрузить туда изображения. Как только это будет сделано, я хотел бы удалить публичный доступ. Одним из вариантов было бы установить разрешение (с рекурсивным публичным доступом) для папки на публичный доступ. Я просто не могу понять, как изменить (точнее добавить) права доступа к файлу в API Google Диска, в PHP.

Альтернативой этому может быть какой-то способ получить изображение через 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 — идентификатор файла. Конечно, при попытке сделать это я должен сначала войти в свою учетную запись Google, что не сработает, поскольку у меня будет другой API, вызывающий эти ссылки и публикующий контент в другой службе. Есть ли способ заставить это работать? Таким образом, мне не пришлось бы беспокоиться о правах доступа к файлам (назад и вперед).


person axelra82    schedule 12.10.2018    source источник
comment
Это похоже на ошибку (пытался найти что-либо похожее, но ничего не нашел), попробуйте опубликовать это в их система отслеживания ошибок.   -  person Mr.Rebot    schedule 16.10.2018
comment
Если вы можете установить авторизацию для запросов из другого API, вы можете использовать имеющийся у вас токен доступа. Загляните в сервисные аккаунты.   -  person tehhowch    schedule 17.10.2018


Ответы (1)


сначала вам нужно удалить старый объект разрешений, этот объект обычно будет иметь этот начальный идентификатор по умолчанию: 10933160239610460256k (я нашел этот идентификатор, когда пытался найти это решение, анализируя взаимодействие внешнего интерфейса GDrive и внутреннего интерфейса)

$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));
person taki fouhal    schedule 11.08.2019
comment
Как вы можете получить идентификатор службы, который вы установили как 10933160239610460256k? - person Hygison Brandao; 13.03.2021