Node.js如何无需重复认证长期下载用户Google Drive内的文件
解决方案
最优方案:使用已申请的服务账号(Service Account)实现永久无人工认证
该方案完全不需要人工授权操作,令牌永久有效,也不需要走应用发布校验流程,适配你的个人使用场景。
- 第一步:配置Drive文件访问权限
打开Google Cloud控制台的「IAM与 admin」-「服务账号」页面,复制你创建的服务账号对应的邮箱地址。打开你要下载的XLSX文件所在的Google Drive文件夹/单个文件,点击「共享」,将刚才复制的服务账号邮箱添加为共享成员,权限选择「查看者」即可,无需发送通知。 - 第二步:替换Node.js认证逻辑
下载服务账号的JSON密钥文件(创建服务账号时可直接生成,存为service-account.json放到项目目录),使用以下逻辑替换原有OAuth认证代码:
const { google } = require('googleapis'); const KEYFILEPATH = './service-account.json'; // 仅申请只读权限即可满足下载需求 const SCOPES = ['https://www.googleapis.com/auth/drive.readonly']; async function getDriveService() { const auth = new google.auth.GoogleAuth({ keyFile: KEYFILEPATH, scopes: SCOPES, }); const authClient = await auth.getClient(); return google.drive({ version: 'v3', auth: authClient }); } // 下载文件的示例逻辑 async function downloadXlsx(fileId, savePath) { const drive = await getDriveService(); const res = await drive.files.get( { fileId: fileId, alt: 'media', // 如果文件在共享团队盘,需要添加下方参数 // supportsAllDrives: true }, { responseType: 'stream' } ); return new Promise((resolve, reject) => { const dest = require('fs').createWriteStream(savePath); res.data.pipe(dest); dest.on('finish', resolve); dest.on('error', reject); }); }
其他方案说明
- API Key方案不可行:API Key仅能访问公开可访问的Drive文件,你的私有文件无法通过API Key调取,不满足需求。
- 原有OAuth Client免校验延长有效期方案:如果你坚持使用现有OAuth Client,可直接在Google Cloud控制台的「API和服务」-「OAuth同意屏幕」页面,将发布状态从「测试」改为「正式版」,不需要提交谷歌校验,只要你作为唯一内部用户使用,刷新令牌的有效期会变为永久,不会出现7天过期的问题。
内容的提问来源于stack exchange,提问作者Oliver Goossens
相关产品推荐
相关产品推荐

