【问题标题】:Google APPs managed "unlimited" account storage quota for service accountGoogle APP 管理服务帐户的“无限”帐户存储配额
【发布时间】:2015-03-28 07:58:58
【问题描述】:

作为学生,我有一个 Google 帐户。此帐户由我的大学管理,最近大学通知我们,学生的帐户现在可以“无限”存储云端硬盘等。

为了执行备份,我在 Google API 控制台 (XXX@developer.gserviceaccount.com) 中创建了一些服务帐户。但事实证明,这些帐户的存储空间限制为 15GB,也就是说,当尝试将文件上传到其中已经有 ~15GB 的服务帐户之一时,我收到一个错误“客户端超出了他的存储配额”。

我询问了大学管理员,他们不知道如何提供帮助,甚至在托管帐户列表中都没有看到服务帐户的电子邮件 (XXX@developer.gserviceaccount.com)。

所以问题是(由我或大学管理员)应该做什么来删除(或增加)我的服务帐户的存储配额,当这些服务帐户使用“无限制”学生帐户打开时。

更新:尝试@DaImTo 建议:

所以我在我的云端硬盘网络界面中创建了一个文件夹并与我的服务帐户共享它。然后,使用服务帐户,我将文件上传到该文件夹​​(使用 PyDrive 库):

file1 = drive.CreateFile({'title': 'test2', 'parents': [{"kind": "drive#fileLink", "id": shared_folder_id}]})
file1.SetContentString('some text')
file1.Upload()
print 'File ID: %s' % file1['id']
permissions = file1.auth.service.permissions().list(fileId=file1['id']).execute()
print "permissions:", permissions

输出:

File ID: XXX
permissions: {u'items': [{u'kind': u'drive#permission', u'name': u'XXX@developer.gserviceaccount.com', u'domain': u'developer.gserviceaccount.com', u'etag': u'"XXX"', u'emailAddress': u'XXX@developer.gserviceaccount.com', u'role': u'owner', u'type': u'user', u'id': u'XXX', u'selfLink': u'https://www.googleapis.com/drive/v2/files/XXX/permissions/XXX'},
{u'kind': u'drive#permission', u'name': u'<my name>', u'domain': u'<my school domain>', u'etag': u'"XXX"', u'emailAddress': u'<my name>@<my school domain>', u'role': u'writer', u'type': u'user', u'id': u'XXX', u'selfLink': u'https://www.googleapis.com/drive/v2/files/XXX/permissions/XXX'}], u'kind': u'drive#permissionList', u'etag': u'"XXX"', u'selfLink': u'https://www.googleapis.com/drive/v2/files/XXX/permissions?alt=json'}

所以上传的文件自动拥有两个权限: 1.服务帐号是“所有者” 2.我的主账号是“作家”

确实,我可以在网页界面看到文件,编辑,删除等。但是,由于服务帐户是所有者,文件被计入服务帐户存储配额,所以这并不能解决我的问题,即我的备份应用程序仍然无法使用超过 15GB 的空间。

我尝试将所有权转移到我的主帐户:

file1 = drive.CreateFile({'id': file_id})
permissions = file1.auth.service.permissions().list(fileId=file1['id']).execute()
myperm_id = permissions['items'][1]['id'] # this is the second permission, i.e. of my main account
myperm = file1.auth.service.permissions().get(fileId=file1['id'], permissionId=myperm_id).execute()
myperm['role'] = 'owner'
file1.auth.service.permissions().update(fileId=file1['id'], permissionId=myperm['id'], body=myperm).execute()

...得到一个错误:

googleapiclient.errors.HttpError: <HttpError 403 when requesting https://www.googleapis.com/drive/v2/files/XXX/permissions/XXX?alt=json returned "Insufficient permissions for this file">

我尝试附加 transferOwnership='True':

file1.auth.service.permissions().update(fileId=file1['id'], permissionId=myperm['id'], body=myperm, transferOwnership='True').execute()

遇到同样的错误。我被困在这里了。

顺便说一句,在 Google 帮助中 Transfer file ownership 他们说“如果您是 Google Apps 用户,则不能将所有权转让给您域外的其他人。”

【问题讨论】:

    标签: google-api google-drive-api google-apps google-apps-for-education


    【解决方案1】:

    服务帐户不是您。将服务帐户视为虚拟 Google 用户,它有自己的 Google 驱动器帐户、Google 日历帐户……

    这可能与可以在 Google 开发者控制台中访问它的开发者松散相关,如果使用服务帐户的应用程序开始向 Google 驱动器发送垃圾邮件,则开发者控制台帐户将被关闭。但除此之外,您和您创建的任何服务帐户都是独立的实体。在您授予它访问无限驱动器帐户的权限之前,它无法访问您的无限驱动器帐户。 (希望我有一个无限驱动器帐户)

    现在它是一个实体,但我不太确定学校是否可以授予它访问权限。真的,我不确定我是否希望它会删除我对服务帐户的控制的一部分。一些学校管理员可能有一天会删除它并破坏一切.....

    我建议您这样做,让服务帐户访问您的 Google 帐户。打开谷歌驱动网页版。我建议你创建一个新目录。在共享权限中,获取服务帐户的电子邮件地址并为其提供对该目录的完全访问权限。然后它应该能够上传到您惊人的无限驱动器帐户的目录。

    更新只是想到了一些事情:一旦您授予它访问驱动器目录的权限,您可能必须检查它可以访问哪些目录。您需要确保它上传到您共享的驱动器而不是其根目录。

    更新权限:

    您可能正在使用file.insert 上传文件。这只是第一步。

    上传文件后,您需要对其进行修补,并更改您个人的权限,而不是服务帐户对文件的访问权限。当文件上传时,它仍然由服务帐户拥有

    您需要使用Files: patch 来更新文件的权限,并授予您对文件的访问权限,而不是服务帐户。

    很遗憾,在上传文件时(此时)无法设置文件的权限。我不确定这是一个错误还是它只是不支持我几天前创建了一个问题请求。 Issue 3717: Google drive api, upload file with shared permission

    【讨论】:

    • 完美,有效。我可以使用 Pydrive 上传到共享文件夹,只需要提及“父母 id”,这将是共享文件夹的 id。
    • 我之前的评论为时过早。我仍然卡住了,这就是为什么:虽然我可以使用服务帐户将文件上传到主(无限制)帐户上的共享文件夹,但这些文件由服务帐户“拥有”,主帐户具有“作家“ 角色。因此它们被计入服务帐户存储配额,因此它不能解决我的问题。我试图将所有权转移到主帐户但没有成功(出现“权限不足”错误)。谷歌帮助说,所有权只能转移给同一域中的用户。有没有其他办法?
    • 在 API 中检查服务帐户授予您访问权限所需的权限。谷歌它,当我在电脑附近时,我会给你一个链接
    • 恐怕我不明白你的评论。谁需要授予谁访问权限?在哪里?我在谷歌上搜索了三天这个问题。我等你的链接。感谢您的帮助。
    • 检查我的更新,您只需要使用 files.patch 命令更新文件权限。
    【解决方案2】:

    似乎无法将服务帐号上传的文件的所有权转移到主帐号。

    最后我放弃了服务帐户的方法,并按照this 的方法以我的普通用户身份运行我的应用程序。

    完成其中描述的步骤后,我将创建如下驱动器服务:

    import httplib2
    from pydrive.auth import GoogleAuth
    from pydrive.drive import GoogleDrive
    
    gauth = GoogleAuth()
    gauth.LoadCredentialsFile("GoogleDriveCredentials.txt")
    if gauth.credentials is None:
        gauth.LocalWebserverAuth()
    elif gauth.access_token_expired:
        print "Google Drive Token Expired, Refreshing"
        gauth.Refresh()
    else:
        gauth.Authorize()
    gauth.SaveCredentialsFile("GoogleDriveCredentials.txt")
    drive = GoogleDrive(gauth) 
    

    其中 GoogleDriveCredentials.txt 的格式为:

    {"_module": "oauth2client.client", "token_expiry": "XXX", "access_token": "XXX", "token_uri": "https://accounts.google.com/o/oauth2/token", "invalid": false, "token_response": {"access_token": "XXX", "token_type": "Bearer", "expires_in": 3600}, "client_id": "XXX.apps.googleusercontent.com", "id_token": null, "client_secret": "XXX", "revoke_uri": "https://accounts.google.com/o/oauth2/revoke", "_class": "OAuth2Credentials", "refresh_token": "XXX", "user_agent": null}
    

    现在上传的文件在网页界面的所有者是“我”,它们被计入我的主帐户的存储配额,所以我的目标达到了。

    【讨论】:

    • 太好了,你让它工作了。让我烦恼的是您是如何获得服务帐户凭据的?也许您没有填写sub 字段。如果您填写它,服务帐户将模拟给定用户。对我来说,文件的所有者就是被模拟的帐户。
    • @okipol 你能解释一下吗?我了解到您找到了一种通过服务帐户使用原始 Gmail 帐户空间的方法,或者您可以向原始 Gmail 帐户授予权限?
    猜你喜欢
    • 2015-05-10
    • 2013-07-10
    • 1970-01-01
    • 2018-12-04
    • 2012-09-02
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 2017-07-07
    相关资源
    最近更新 更多