在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
相关产品推荐
相关产品推荐

