Google Drive API – 从服务帐户转移所有权

我正在尝试将所有权从服务帐户创建的文档转移到使用以下代码驻留在同一Google Apps帐户中的其他用户,但我收到以下错误

资源主体包括不可直接写入的字段。 [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; 

评论//权限.Role =“所有者”; 返回以下错误

当权限角色为“所有者”时,必须启用transferOwnership参数。 [403]错误[消息[当权限角色为’所有者’时,必须启用transferOwnership参数。)位置[transferOwnership – 参数]原因[禁止]域[全局]]

分配任何其他权限工作正常。 因此,这是服务帐户的限制,无法将所有权转移到不使用@ gserviceaccount.com电子邮件地址的任何其他帐户(即our-project@appspot.gserviceaccount.com> email@domain.com) ?

email@domain.com电子邮件地址已创建并在Google Apps中进行管理。

在这种情况下,它是不可能实现的,任何指针在哪里看下一步? 我们需要多个用户能够临时创建文档,并通过API动态分配权限和转移所有权。

谢谢

我找到了答案,并发布给遇到此问题的其他人。

  1. 您无法使用Google推荐的“服务帐户密钥JSON文件”。
  2. 您需要使用p.12证书文件进行身份validation。
  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. 您需要按照此处列出的步骤将域范围的权限委派给服务帐户。

  5. 完成第4步后需要5到10分钟。
  6. 您现在可以在’emailAccountToMimic’用户下创建文档,该用户在创建过程中将它们设置为所有者。

我认为不可能将所有权从非ServiceAccount转移到ServiceAccount,反之亦然。

如果以交互方式执行此操作,您将收到以下错误:

在此处输入图像描述

通常,文档可以由用户创建和拥有,并且所有权转移可以使用他们自己的凭证来完成。 如果您的服务帐户被正确授予了域范围的委派,您还可以选择模拟所有者。