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

Node.js后端验证Firebase ID Token后,如何代用户访问Google Sheets API?

解决方案:通过Firebase Auth用户凭证访问Google Sheets API

核心思路

验证Firebase ID Token后,借助用户关联的Google账号OAuth凭证换取访问令牌,以此调用Google Sheets API。以下是具体实现步骤:


1. 前置准备

  • 确保用户通过Google账号登录Firebase(非其他登录方式)。
  • 在Firebase控制台「身份验证」→「登录方式」中启用Google身份提供商,记录对应的客户端ID和客户端密钥。
  • 在Google Cloud Console的「OAuth同意屏幕」中,添加Google Sheets API权限(如https://www.googleapis.com/auth/spreadsheets或只读权限https://www.googleapis.com/auth/spreadsheets.readonly)。
  • 前端登录时需请求offline_access权限:在signInWithPopup或signInWithRedirect配置中,给GoogleAuthProvider添加accessType: 'offline'和prompt: 'consent',确保后端能获取用户的refresh_token。

2. Node.js后端实现代码

首先安装依赖:

npm install firebase-admin googleapis

初始化Firebase Admin SDK

const admin = require('firebase-admin');
const { google } = require('googleapis');

// 初始化Firebase Admin(可使用服务账号密钥或默认凭证)
admin.initializeApp({
  credential: admin.credential.applicationDefault()
});

从Firebase用户获取Google访问令牌

async function getGoogleUserAccessToken(uid) {
  // 获取Firebase用户信息
  const firebaseUser = await admin.auth().getUser(uid);
  // 筛选Google账号的提供商数据
  const googleProvider = firebaseUser.providerData.find(p => p.providerId === 'google.com');

  if (!googleProvider || !googleProvider.refreshToken) {
    throw new Error('该用户未通过Google账号登录,或未授予离线访问权限');
  }

  // 配置Google OAuth客户端
  const oauthClient = new google.auth.OAuth2(
    process.env.GOOGLE_CLIENT_ID, // 从Firebase控制台获取
    process.env.GOOGLE_CLIENT_SECRET, // 从Firebase控制台获取
    'https://<你的项目ID>.firebaseapp.com/__/auth/handler' // Firebase Google登录默认回调URL
  );

  // 用refresh token换取访问令牌
  oauthClient.setCredentials({ refresh_token: googleProvider.refreshToken });
  const { token } = await oauthClient.getAccessToken();
  
  return token;
}

调用Google Sheets API

async function fetchSpreadsheetData(uid, spreadsheetId, range = 'Sheet1!A1:C10') {
  const accessToken = await getGoogleUserAccessToken(uid);
  
  // 初始化Sheets API客户端
  const sheetsApi = google.sheets({
    version: 'v4',
    auth: accessToken
  });

  // 读取表格数据(可替换为写入等操作)
  const response = await sheetsApi.spreadsheets.values.get({
    spreadsheetId,
    range
  });

  return response.data.values || [];
}

3. 关键注意事项

  • 若用户首次登录未授权offline_access,需引导其重新登录并通过prompt: 'consent'强制弹出授权框。
  • 确保Google Cloud Console中已启用Google Sheets API(在「API和服务」→「库」中搜索启用)。
  • 访问令牌有效期为1小时,可通过refresh token自动刷新,无需用户再次授权。

内容的提问来源于stack exchange,提问作者Ruslan Plastun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 05:54:09