2016-08-12 61 views
2

我试图从服务帐户创建的文档所有权转让给使用下面的代码谁所在的同一个谷歌Apps帐户中的其他用户,但我发现了以下错误谷歌云端硬盘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中进行管理。

在这种情况下,它是不可实现的,任何指向下一步的指针?我们需要多个用户有能力通过API临时创建文档并分配权限并实时传输所有权。

感谢

+0

尝试使用补丁而不是更新? https://developers.google.com/drive/v2/reference/permissions/patch – DaImTo

+0

谢谢@DalmTo但我使用的是V3 API,更新功能是V2中的旧补丁功能[迁移到Google Drive API v3]( https://developers.google.com/drive/v3/web/migration)。 – timkly

+0

好的是一个猜测很难判断它是否是你的代码的v2或v3。修补工作在V2中。权限是谷歌驱动器的一个痛苦。 – DaImTo

回答

0

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

  1. 您不能使用Google推荐的'服务帐户密钥JSON文件'。
  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. 完成第4步后需要5到10分钟。
  6. 您现在可以在'emailAccountToMimic'用户下创建文档,并在创建过程中将其设置为所有者。
+0

仅供参考 - 事实证明,您需要使用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

相关问题