Node.js服务端无需浏览器弹窗获取Google OAuth accessToken及照片
无浏览器交互:Node.js服务端通过服务账号获取Google Photos内容
要实现纯服务端无浏览器认证,你得用Google服务账号(ServiceAccount)——这是唯一绕开用户交互的方案,OAuth2授权码流程必须用户手动确认,而服务账号可以通过密钥文件直接完成身份验证。
前置要求
- 如果你用的是Google Workspace(原G Suite)账号:需要域管理员开启域范围委派,让服务账号能模拟域内用户访问Photos资源。
- 普通个人Google账号:得把你要访问的所有Google Photos相册共享给服务账号的邮箱(服务账号邮箱格式类似
xxx@xxx.iam.gserviceaccount.com,创建服务账号时会生成)。
分步实现
1. 创建服务账号并获取密钥文件
- 登录Google Cloud控制台,新建项目后启用Google Photos Library API。
- 进入「IAM与管理」→「服务账号」,创建服务账号,给它分配
Photos Library Admin或Photos Library Viewer权限(按需选读写/只读)。 - 为该服务账号创建并下载JSON格式的密钥文件,保存为
service-account-key.json。
2. Node.js代码实现认证与API调用
用googleapis库完成认证和内容拉取,全程无浏览器交互:
const { google } = require('googleapis'); const fs = require('fs'); // 加载服务账号密钥文件 const keyFilePath = './service-account-key.json'; const credentials = JSON.parse(fs.readFileSync(keyFilePath, 'utf8')); // 初始化JWT认证客户端 const authClient = new google.auth.JWT( credentials.client_email, null, credentials.private_key, // 权限范围:按需选只读或读写 ['https://www.googleapis.com/auth/photoslibrary.readonly'], // Workspace账号填要模拟的域内用户邮箱;普通账号留空 'user@your-domain.com' ); // 批量获取所有Photos媒体内容 async function getAllPhotos() { try { // 完成认证 await authClient.authorize(); // 初始化Photos API客户端 const photosApi = google.photoslibrary({ version: 'v1', auth: authClient }); let allMediaItems = []; let nextPageToken = null; // 分页拉取(API单页最多返回100条) do { const response = await photosApi.mediaItems.list({ pageToken: nextPageToken, pageSize: 100 }); if (response.data.mediaItems) { allMediaItems = [...allMediaItems, ...response.data.mediaItems]; } nextPageToken = response.data.nextPageToken; } while (nextPageToken); console.log('拉取到所有媒体内容:', allMediaItems); return allMediaItems; } catch (error) { console.error('拉取Photos内容失败:', error.message); throw error; } } // 执行拉取 getAllPhotos();
重要注意事项
- 权限限制:普通个人账号下,服务账号只能访问被共享给它的相册,无法直接读取私有未共享的内容——这是Google的权限规则,没法绕过。
- Workspace配置:域管理员必须在「安全」→「API控制」→「域范围委派」中,为服务账号的客户端ID添加对应的Photos API权限范围,否则模拟用户会失败。
- API配额:Google Photos API有调用次数限制,可在Cloud控制台查看并调整配额(如果需要)。
- 依赖安装:记得先安装依赖包:
npm install googleapis
内容的提问来源于stack exchange,提问作者Sumant Mishra
相关产品推荐
相关产品推荐

