You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Python Flask应用中后台调用Google Drive API无用户OAuth上传文件

使用服务账号实现GCP Flask应用无交互归档文件到Google Drive

核心方案

用GCP服务账号替代用户OAuth流程,服务账号代表你的应用身份,无需用户登录授权即可完成后台操作;同时结合Google Cloud Storage(GCS)解决无服务器环境下的凭证存储问题。

步骤1:创建并配置服务账号

  • 在GCP控制台「IAM与管理」→「服务账号」页面,创建新服务账号,下载对应的JSON密钥文件(命名为service-account-key.json)。
  • 打开目标Google Drive文件夹,点击「共享」,将服务账号邮箱(格式如xxx@xxx.iam.gserviceaccount.com)添加为成员,授予「编辑」权限,确保服务账号能写入该文件夹。

步骤2:修改代码适配服务账号认证

先安装官方推荐的认证依赖(替换旧的oauth2client库):

pip install google-auth google-auth-httplib2 google-api-python-client google-cloud-storage

替换原有上传代码,支持从GCS加载服务账号密钥:

import io
import json
from google.oauth2 import service_account
from googleapiclient.discovery import build
from googleapiclient.http import MediaIoBaseUpload
from google.cloud import storage

# 自定义配置参数
SCOPES = ['https://www.googleapis.com/auth/drive.file']
GCS_BUCKET_NAME = '你的GCS桶名称'
GCS_KEY_FILE_PATH = 'service-account-key.json'  # 密钥在GCS中的存储路径
TARGET_DRIVE_FOLDER_ID = '你的Drive目标文件夹ID'

def get_service_account_creds():
    # 从GCS加载服务账号密钥内容
    storage_client = storage.Client()
    bucket = storage_client.bucket(GCS_BUCKET_NAME)
    blob = bucket.blob(GCS_KEY_FILE_PATH)
    key_content = blob.download_as_string()
    return service_account.Credentials.from_service_account_info(
        json.loads(key_content),
        scopes=SCOPES
    )

def upload_to_drive(name, input_dict):
    creds = get_service_account_creds()
    drive_service = build('drive', 'v3', credentials=creds)

    file_metadata = {
        'name': f'{name}.json',
        'parents': [TARGET_DRIVE_FOLDER_ID],
        'mimeType': 'application/json'  # 修正为标准MIME类型
    }

    media = MediaIoBaseUpload(
        io.BytesIO(json.dumps(input_dict).encode('utf-8')),
        mimetype='application/json'
    )
    file = drive_service.files().create(
        body=file_metadata,
        media_body=media,
        fields='id'
    ).execute()
    return file.get('id')

步骤3:配置无服务器环境权限

  • 将service-account-key.json上传到你的GCS桶中。
  • 给运行Flask应用的GCP身份(如Cloud Run服务账号、App Engine默认服务账号)添加GCS桶的「存储对象查看者」权限,确保应用能读取密钥文件。

关键说明

  • 服务账号属于应用级身份,所有操作以该账号名义执行,全程无需用户介入。
  • 弃用了维护状态不佳的oauth2client库,改用Google官方维护的google-auth系列库,避免兼容性问题。
  • 修正了原代码中的非标准mimeType值,改用application/json符合规范。

内容的提问来源于stack exchange,提问作者Watch and Shoot Developments

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 10:00:20