2016-08-12 3 views
2

Я пытаюсь передать в собственность из учетной записи службы, созданного документа другому пользователю, который проживает в том же аккаунте Служб Google, используя этот код, но я получаю следующую ошибкуGoogle Drive API - Передача права собственности от учетной записи службы

Орган ресурса включает в себя поля, которые не могут быть доступны для записи. [403] Ошибки [Сообщение [Тело ресурс включает в себя поля, которые не являются непосредственно для записи] Местоположение [-.] Причина [fieldNotWritable] Домен [глобальный]]

 var service = GetService(); 

     try 
     { 
      var permission = GetPermission(fileId, email); 
      permission.Role = "owner"; 

      var updatePermission = service.Permissions.Update(permission, fileId, permission.Id); 
      updatePermission.TransferOwnership = true; 
      return updatePermission.Execute(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("An error occurred: " + e.Message); 
     } 
     return null; 

Комментирование // permission.Role = " владелец "; возвращает ошибку ниже

Параметр transferOwnership должен быть включен, когда роль разрешения является «владельцем». [403] Ошибки [Сообщение [Параметр transferOwnership должен быть включен, если роль разрешения «владелец».] Местоположение [transferOwnership - параметр] Причина [запрещено] Домен [глобальный]]

Назначение любых других разрешений работает нормально. Таким образом, это ограничение учетной записи службы, которая не может передавать право собственности на любую другую учетную запись, которая не использует адрес электронной почты @ gserviceaccount.com (например, [email protected]> [email protected]) ?

Адрес электронной почты [email protected] был создан и управляется в Google Apps.

В случае, это не достижимо, любые указатели на то, где смотреть дальше? Нам нужно, чтобы несколько пользователей имели возможность создавать документы ad hoc и назначать разрешения и передавать права собственности на лету через API.

Благодаря

+0

Попробуйте патч вместо обновления? https://developers.google.com/drive/v2/reference/permissions/patch – DaImTo

+0

Спасибо @DalmTo, но я использую V3 API, а функция Update - это старая функция Patch из V2 [Переход на Google Drive API версии 3] (https://developers.google.com/drive/v3/web/migration). – timkly

+0

Хорошо было предположить, что было сложно сказать, был ли это v2 или v3 с вашим кодом. Патч работал в V2. Разрешения - это боль с приводом Google. – DaImTo

ответ

0

Я нашел ответ и отправляю для всех, кто сталкивается с этим вопросом.

  1. Вы не можете использовать «JSON-файл ключа учетной записи службы» в соответствии с рекомендациями Google.
  2. Для аутентификации необходимо использовать файл сертификата p.12.
  3. Код для создания службы передачи для имитации счетов выглядит следующим образом.

    public DriveService GetService(string certificatePath, string certificatePassword, string googleAppsEmailAccount, string emailAccountToMimic, bool allowWrite = true) 
    { 
        var certificate = new X509Certificate2(certificatePath, certificatePassword, X509KeyStorageFlags.Exportable); 
    
        var credential = new ServiceAccountCredential(
         new ServiceAccountCredential.Initializer(googleAppsEmailAccount) 
         { 
          Scopes = new[] { allowWrite ? DriveService.Scope.Drive : DriveService.Scope.DriveReadonly }, 
          User = emailAccountToMimic 
         }.FromCertificate(certificate)); 
    
        // Create the service. 
        return new DriveService(new BaseClientService.Initializer 
        { 
         HttpClientInitializer = credential, 
         ApplicationName = ApplicationName 
        }); 
    } 
    
  4. Вы должны следовать инструкциям, приведенных here делегировать общедоменное полномочие учетной записи службы.

  5. Разрешить от 5 до 10 минут после завершения этапа 4.
  6. Теперь вы можете создавать документы под пользователем «EmailAccountToMimic», который устанавливает их владельцем во время создания.
+0

FYI. Оказывается, вам нужно создать документ, используя учетную запись emailAccountToMimic, а затем назначить разрешения «Writer» для документа для учетной записи службы, которые затем могут записать в документ. – timkly

0

Я не думаю, что можно передать в собственность от не ServiceAccount к ServiceAccount, наоборот.

Если вы сделаете это в интерактивном режиме, вы получите ошибку ниже:

enter image description here

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

+0

Спасибо @ some1. Я на самом деле пытаюсь назначить разрешения из ServiceAccount для не-ServiceAccount, и я настроил делегирование домена для учетной записи службы и назначил разрешения, как описано [здесь] (https://developers.google.com/identity/ протоколы/OAuth2ServiceAccount), но я использую JSON-файл ключа учетной записи службы (по рекомендации Google), у которого есть другой инициализатор аутентификации OAuth 2.0, который использует вместо этого сертификат ... но он также позволяет олицетворять учетную запись при использовании ServiceAccountCredential Метод инициализации. – timkly