【发布时间】:2016-08-15 08:11:39
【问题描述】:
我正在尝试使用以下代码将所有权从服务帐户创建的文档转移给位于同一 Google Apps 帐户中的另一个用户,但出现以下错误
资源主体包含不可直接写入的字段。 [403] 错误 [消息[资源正文包含不可直接写入的字段。] Location[ - ] Reason[fieldNotWritable] Domain[global]]
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 = "owner";返回下面的错误
当权限角色为“所有者”时,必须启用 transferOwnership 参数。 [403] 错误 [消息[当权限角色为“所有者”时,必须启用 transferOwnership 参数。] Location[transferOwnership - parameter] Reason[forbidden] Domain[global]]
分配任何其他权限都可以正常工作。因此,这是服务帐户无法将所有权转移到不使用@gserviceaccount.com 电子邮件地址的任何其他帐户的限制(即 our-project@appspot.gserviceaccount.com > email@domain.com) ?
email@domain.com 电子邮件地址已创建并在 Google Apps 中进行管理。
在这种情况下,这是无法实现的,关于下一步该去哪里的任何指示?我们需要多个用户能够通过 API 即时创建文档并分配权限和转移所有权。
谢谢
【问题讨论】:
-
感谢@DalmTo,但我使用的是 V3 API,更新功能是来自 V2 Migrate to Google Drive API v3 的旧补丁功能。
-
好吧,你的代码很难判断它是 v2 还是 v3。补丁在 V2 中工作。权限对于 Google 云端硬盘来说是一件很痛苦的事情。
-
如您所说,您可以使用 ServiceAccountCredential.Initializer 方法对具有 Drive 服务权限和数据传输权限的 impersonate a user。这反过来将委派对服务帐户的域范围访问。请参阅this 代码实现。希望这会有所帮助!
标签: c# google-drive-api