无需OAuth2,仅用API密钥能否向公开Google文件夹/表格写入数据?
关于Google Drive API用API密钥写入公开资源的问题
很遗憾,仅靠API密钥是没法向公开的Google Drive文件夹/表格写入数据的。
为什么API密钥不行?
API密钥的核心作用只是用来标识你的应用身份,它的权限非常有限:只能对设置为公开可读的资源进行只读访问,完全没有写入、修改的权限。这是Google API的安全设计——要是随便一个API密钥就能改数据,那公开资源的安全根本没法保证。
符合你需求的替代方案:服务账号
你们想要「无需用户授权、不用共享令牌就能分发应用」的需求,其实可以用服务账号来实现。服务账号是Google专为无人值守/服务器端应用设计的身份,它不需要用户手动点授权,只要把目标公开文件夹(或表格)共享给服务账号的邮箱就行。
具体实现步骤(Python)
准备服务账号密钥:
去Google Cloud控制台创建一个服务账号,下载对应的JSON密钥文件(这个文件要妥善保管,别泄露)。安装依赖包:
pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib替换原有OAuth代码为服务账号代码:
下面是两个常见场景的示例:场景1:向公开Drive文件夹上传文件
from google.oauth2 import service_account from googleapiclient.discovery import build from googleapiclient.http import MediaFileUpload # 配置参数 SCOPES = ['https://www.googleapis.com/auth/drive.file'] SERVICE_ACCOUNT_KEY_PATH = '你的服务账号密钥文件路径.json' TARGET_FOLDER_ID = '你的公开文件夹ID' # 加载服务账号凭证 credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_KEY_PATH, scopes=SCOPES ) # 构建Drive服务 drive_service = build('drive', 'v3', credentials=credentials) # 上传文件 file_metadata = { 'name': '要上传的文件名.txt', 'parents': [TARGET_FOLDER_ID] } media = MediaFileUpload('本地文件路径.txt', mimetype='text/plain') uploaded_file = drive_service.files().create( body=file_metadata, media_body=media, fields='id' ).execute() print(f"文件上传成功,ID: {uploaded_file['id']}")场景2:向公开Google Sheets写入数据
from google.oauth2 import service_account from googleapiclient.discovery import build # 配置参数 SCOPES = ['https://www.googleapis.com/auth/spreadsheets'] SERVICE_ACCOUNT_KEY_PATH = '你的服务账号密钥文件路径.json' SPREADSHEET_ID = '你的公开表格ID' WRITE_RANGE = 'Sheet1!A1:B2' # 要写入的单元格范围 # 加载服务账号凭证 credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_KEY_PATH, scopes=SCOPES ) # 构建Sheets服务 sheets_service = build('sheets', 'v4', credentials=credentials) # 准备要写入的数据 values = [ ['第一行第一列', '第一行第二列'], ['第二行第一列', '第二行第二列'] ] body = {'values': values} # 执行写入 result = sheets_service.spreadsheets().values().update( spreadsheetId=SPREADSHEET_ID, range=WRITE_RANGE, valueInputOption='RAW', body=body ).execute() print(f"成功更新 {result['updatedCells']} 个单元格")共享资源给服务账号:
打开你的公开文件夹/表格,点击「共享」,输入服务账号JSON文件里的client_email字段值,给它编辑者权限,保存即可。
最后再强调一下
API密钥真的只能做只读操作,别再尝试用它写数据了。服务账号才是完全符合你需求的方案——不用用户授权,只要做好资源共享,部署应用时带上密钥文件就能正常工作。
内容的提问来源于stack exchange,提问作者steffres
相关产品推荐
相关产品推荐

