deb*_*ian 2 python oauth google-api google-drive-api google-oauth
我是一名拥有近 300 名用户的 GSuite 管理员,我正在从 GSuite 迁移。我需要下载他们创建/上传的所有用户文件。
我从编写一个 Python 脚本开始,该脚本将在列表中向我显示用户文件,并且似乎我遇到了压倒性的授权问题。
https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/admin.datatransfer,https://www.googleapis.com/auth/admin.directory.user, https://www.googleapis.com/auth/admin.directory.group根据文档(https://developers.google.com/admin-sdk/directory/v1/guides/delegation)非常好
我正在从 ServiceAccountCredentials 创建一个资源对象,并分别基于 API 名称/版本“drive”和“v3”构建一个对象,并尝试根据 Google 的快速入门(https://developers.google.com/drive)获取文件列表/api/v3/quickstart/python):
from googleapiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials
SERVICE_ACCOUNT_EMAIL = "drive-getter@mygoogledomain.iam.gserviceaccount.com"
SERVICE_ACCOUNT_PKCS12 = "./service_key.json"
def create_directory_service(user_email):
credentials = ServiceAccountCredentials.from_json_keyfile_name(SERVICE_ACCOUNT_PKCS12, scopes=['https://www.googleapis.com/auth/drive'])
credentials = credentials.create_delegated(user_email)
return build('drive', 'v3', credentials=credentials)
resource = create_directory_service('username@mydomain.com')
results = resource.files().list(
pageSize=10, fields="nextPageToken, files(id, name)"
).execute()
items = results.get('files', [])
print(items)
Run Code Online (Sandbox Code Playgroud)它看起来完全正确,但我收到此错误消息:
连接到 pydev 调试器 (build 181.5087.37)
回溯(最近一次调用):文件“/Applications/PyCharm.app/Contents/helpers/pydev/pydevd.py”,第 1664 行,在 main() 文件“/Applications/PyCharm.app/Contents/helpers/pydev/ pydevd.py", line 1658, in main globals = debugger.run(setup['file'], None, None, is_module) File "/Applications/PyCharm.app/Contents/helpers/pydev/pydevd.py", line 1068, in run pydev_imports.execfile(file, globals, locals) # 执行脚本 File "/Applications/PyCharm.app/Contents/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile exec(compile(contents+ "\n", file, 'exec'), glob, loc) 文件 "/Users/probe/Projects/drive_getter/src/dconnect.py", line 16, in pageSize=10, fields="nextPageToken, files(id , 姓名)”文件“/Users/probe/Projects/drive_getter/drive_getter/lib/python3.6/site-packages/googleapiclient/_helpers.py”,第 130 行,在 positional_wrapper 中返回wrapped(*args, **kwargs) 文件“/Users/ probe/Projects/drive_getter/drive_getter/lib/python3.6/site-packages/googleapiclient/http.py”,第 835 行,在 execute method=str(self.method), body=self.body, headers=self.headers 中) 文件“/Users/probe/Projects/drive_getter/drive_getter/lib/python3.6/site-packages/googleapiclient/http.py”,第 162 行,在 _retry_request resp, content = http.request(uri, method, *args , **kwargs) 文件“/Users/probe/Projects/drive_getter/drive_getter/lib/python3.6/site-packages/oauth2client/transport.py”,第 159 行,在 new_request 凭证中。_refresh(orig_request_method) 文件“/Users/probe/Projects/drive_getter/drive_getter/lib/python3.6/site-packages/oauth2client/client.py”,第 749 行,在 _refresh self._do_refresh_request(http) 文件“/Users/probe/Projects/drive_getter/ drive_getter/lib/python3.6/site-packages/oauth2client/client.py”,第 819 行,在 _do_refresh_request 中引发 HttpAccessTokenRefreshError(error_msg, status=resp.status) oauth2client.client.HttpAccessTokenRefreshError:未授权的客户端:客户端未经授权检索访问令牌使用这种方法。在 _do_refresh_request 中引发 HttpAccessTokenRefreshError(error_msg, status=resp.status) oauth2client.client.HttpAccessTokenRefreshError:未授权的客户端:客户端未经授权使用此方法检索访问令牌。在 _do_refresh_request 中引发 HttpAccessTokenRefreshError(error_msg, status=resp.status) oauth2client.client.HttpAccessTokenRefreshError:未授权的客户端:客户端未经授权使用此方法检索访问令牌。
知道在这个过程中做错了什么吗?再次 - 我的目标是列出并稍后下载所有 GSuite 用户的所有用户文件,所以我想循环我的用户电子邮件并对所有用户应用相同的逻辑,直到我下载所有文件。
感谢您的合作!
客户端无权使用此方法检索访问令牌。
Google Develoepr 控制台中有几种不同类型的客户端。
可以理解,用于对这些不同类型进行身份验证的代码是不同的。
您使用的代码似乎是具有服务帐户的 python 的正确代码。虽然from_json_keyfile_name接受 p12 文件而不是 .json 文件。
那里的客户必须是正确的。返回 Google 开发者控制台创建服务帐户客户端并下载正确的 .json 文件。
from google.oauth2 import service_account
SCOPES = ['https://www.googleapis.com/auth/sqlservice.admin']
SERVICE_ACCOUNT_FILE = '/path/to/service.json'
credentials = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES)
Run Code Online (Sandbox Code Playgroud)
我建议在 p12 文件上使用 .json 文件,我怀疑谷歌将来会停止使用这些文件。
| 归档时间: |
|
| 查看次数: |
3337 次 |
| 最近记录: |