首页 > 解决方案 > 如何在 Python 37 中将 Drive API 与标准 Google App Engine 的凭据一起使用?

问题描述

我想从 Python 37 中的 GAE(标准)在团队云端硬盘中写入一个文件。我将其服务帐户添加到我的团队云端硬盘成员中。但我不能使用默认的 App Engine 凭据来编写。

我无法使用 App Engine API,因为它们在 GAE Standard for Python 37 中不可用。

from google.auth import default
from googleapiclient import discovery
from googleapiclient.http import MediaIoBaseUpload

def upload_file_to_teamdrive(fd, file_name, team_drive_id, mime_type='application/text'):

        scopes = ['https://www.googleapis.com/auth/cloud-platform', 'https://www.googleapis.com/auth/drive']

        # How to get GAE Credentials ? 
        credentials, project = default(scopes=scopes)

        drive = discovery.build('drive', 'v3', credentials=credentials)

        media = MediaIoBaseUpload(fd, mimetype=mime_type)

        drive.files().create(
            supportsTeamDrives=True,
            media_body=media,
            body={
                'parents': [team_drive_id],  # ID of the Team Drive,
                'name': file_name
            },
            fields='id'
        ).execute()

此代码抛出 403 响应:

googleapiclient.errors.HttpError: https://www.googleapis.com/upload/drive/v3/files?supportsTeamDrives=true&fields=id&alt=json&uploadType=multipart 返回“权限不足:请求的身份验证范围不足。”

从 GAE 写入 Drive 的最佳方式是什么?我的 GAE 如何通过其服务帐户进行身份验证?

谢谢你的帮助。

标签: pythongoogle-app-enginegoogle-drive-api

解决方案


App Engine Environment 公开的凭据只能授权 Google Cloud 范围,不能授权任何其他 Google API 范围,例如https://www.googleapis.com/auth/drive.

您需要使用完整的服务帐户密钥(最好使用 KMS 以确保安全)来访问这些 API。

您可以查看我创建并始终用于连接到 Google API 的库 easygoogle


推荐阅读