Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 谷歌API服务帐户。即使具有域范围的委派访问权限,也只能看到服务帐户驱动器_Python_Google Drive Api_Google Admin Sdk_Google Api Python Client_Google Workspace - Fatal编程技术网

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

Python 谷歌API服务帐户。即使具有域范围的委派访问权限,也只能看到服务帐户驱动器,python,google-drive-api,google-admin-sdk,google-api-python-client,google-workspace,Python,Google Drive Api,Google Admin Sdk,Google Api Python Client,Google Workspace,我目前正在使用一个启用了域范围授权的Google服务帐户(我跟随了这个链接,还有这个链接),并且“范围已启用。我已经下载了服务帐户的json凭据,并将它们放在与python脚本相同的目录中。问题是当我在我的域中模拟另一个用户(比如User2)时,我试图列出User2驱动器中的文件。我只获取服务帐户驱动器中的文件 我有一段模拟User2的代码 def auth(): domain = 'domain' # impersonate this user user = 'test

我目前正在使用一个启用了域范围授权的Google服务帐户(我跟随了这个链接,还有这个链接),并且范围已启用。我已经下载了服务帐户的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-Suite中的另一个用户

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

如果这不是发布问题的正确方式,我深表歉意。这是我的第一篇帖子。

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

更多信息:
  • 分配
    delegated\u credentials
    变量时,委托凭据中缺少作用域
  • 添加主题时,您没有分配新委派的凭据
  • 正如您在文档中所看到的,在定义
    凭证
    对象时,必须指定您将在请求中使用的范围

    然后,将作用域添加到凭据时,需要将其分配给一个变量,该变量可以传递给驱动器服务的构建

    代码修复: 要修复第1点,您需要取消注释范围并更改此行:

    delegated\u credentials=service\u account.credentials.from\u service\u account\u文件(key\u文件)
    
    要包含范围,请执行以下操作:

    scopes=['https://www.googleapis.com/auth/drive']
    委托的\u凭据=服务\u帐户.credentials.from\u服务\u帐户\u文件(
    密钥文件,作用域=作用域)
    
    此外,在构建驱动器服务之前,您还需要将
    委派的\u凭据分配给自身。使用\u subject(subject)

    delegated\u credentials=委托的\u凭证。带有\u主题(主题)
    drive\u service=googleapiclient.discovery.build(
    “驱动器”、“v2”凭据=委派的\u凭据)
    
    我希望这对你有帮助

    参考资料:

    需要说明的是,当您从\u service\u account\u file()调用
    时,结果是服务帐户的凭据,而不是委托凭据。用_subject()调用
    就可以生成委托凭证,正如前面指出的,这是一个新对象。谢谢大家!!!!!我都快疯了。我投了赞成票。