当前位置: 首页 > 知识库问答 >
问题:

谷歌API服务帐户。即使具有域范围的委托访问权限,也只能看到服务帐户驱动器

糜凯泽
2023-03-14

我目前使用的谷歌服务帐户启用了域范围的委托(我使用了这个链接https://developers.Google.com/identity/protocols/oauth2/service-account,和这个链接https://developers.Google.com/admin-sdk/reports/v1/guides/developy),并且启用了“https://www.googleapis.com/auth/drive scope。我已经下载了服务帐户的json凭据,并将它们与我的python脚本放在同一个目录中。问题是当我在我的域中模拟另一个用户让我们说User2时,我试图列出User2驱动器中的文件。我只获得服务帐户驱动器中的

我有一个模拟user2的代码片段。

def auth():
    domain = 'domain'
    # impersonate this user
    user = 'testuser' # id only (ie. without @domain)
    #scopes = ['https://www.googleapis.com/auth/drive',]
    key_file = 'service_account.json'

    subject = ''.join([user,'@',domain])
    delegated_credentials = service_account.Credentials.from_service_account_file(key_file)
    delegated_credentials.with_subject(subject)
    drive_service = googleapiclient.discovery.build('drive', 'v2', credentials=delegated_credentials)

    return drive_service

然后,我将尝试获取用户MyDrive中的文件列表。

children = service.children().list(folderId='root', **param).execute()

for child in children.get('items', []):
    item = service.files().get(fileId=child['id']).execute()

以上项目始终是服务帐户“我的驱动器”中的“入门PDF”

基本上,这样做的全部目的是通过编程方式将任意文件夹(及其内容)的所有权更改给同一G套件中的另一个用户。

还有,我不想像许多其他帖子所说的那样,与我的服务帐户共享一个文件夹。不应该是这样的,因为我是冒充主人的。

共有1个答案

解博明
2023-03-14

身份验证流有两个问题:缺少作用域和变量分配错误。

  1. 当分配delegated_credentials变量时,委托凭据中缺少作用域。
  2. 添加主题时未分配新委派的凭据。

要修正点1,您需要取消对作用域的注释并更改这一行:

delegated_credentials = service_account.Credentials.from_service_account_file(key_file)

要包括范围:

scopes = ['https://www.googleapis.com/auth/drive']
delegated_credentials = service_account.Credentials.from_service_account_file(
        key_file, scopes=scopes)

此外,在构建驱动器服务之前,您需要将delegated_credentials.with_subject(subject)分配给它自己:

delegated_credentials = delegated_credentials.with_subject(subject)
drive_service = googleapiclient.discovery.build(
        'drive', 'v2', credentials=delegated_credentials)
    null
 类似资料:
  • 我们需要访问谷歌日历API与服务器应用程序,以创建事件和邀请与会者。谷歌建议使用服务帐户的应用程序。 这里的主要问题是与会者邀请参加活动,因为如果没有域范围的授权,服务帐户就不能这样做(请参见img)。 组织不希望授予服务帐户访问所有用户数据的权限。所以,我想知道我们是否可以将域范围的授权委托给域的一个用户?(限制访问以使用其他用户的数据)。 附言。它只是关于谷歌日历API。 非常感谢你的帮助。

  • 我为我的帐户name@steelkiwi.com(谷歌应用程序)创建了服务帐户,我的应用程序运行良好。然后我为我的个人帐户name@gmail.com创建了服务帐户,为我的应用程序使用这个新的凭据,现在当我试图插入文件时,我得到错误500和下一个文本: HttpError 500请求https://www.googleapis.com/upload/drive/v2/files时?quotause

  • 为了访问GMail API(并将呼叫拟人化),我使用了一个服务帐户(从谷歌云平台创建)。我的json文件看起来像这样 我还使用oAuth2client库使其更容易,但我找不到创建凭据然后指定范围和委托帐户的方法。 我试过了 但是我得到了一个错误,因为它需要一个PKCS-8密钥。 我该怎么做?(如果有帮助,我的代码在应用程序引擎 Flex 上运行) 谢啦

  • 我想使用谷歌驱动器作为一个网站的准CMS工作,我正在使内容所有者可以编辑他们的内容使用谷歌驱动器。我希望使用一个可以访问Google Drive的特定用户帐户(在写这篇文章时,服务帐户不能直接访问Google Drive),并且能够与内容所有者共享文档。 在阅读了API和教程之后,我在委托中找到了答案:https://developers.google.com/drive/development

  • 我正在使用一个服务帐户访问我们的域名用户的谷歌驱动器,这工作像一个魅力!然而,我现在正在尝试使用相同的服务帐户获得用户的activity在谷歌驱动器。 我已授予服务帐户API访问https://www.googleapis.com/auth/activity和https://www.googleapis.com/auth/drive的权限 并启用API! 然而我总是得到错误403,禁止! 可能需要