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

如何无过期访问Google Drive API?解决刷新令牌频繁失效问题

解决Google Drive API Refresh Token频繁过期问题

问题分析

当前你用Google OAuth Playground生成的refresh token每3-4天就失效,核心原因是Playground的redirect_uri属于测试用途,生成的refresh token不具备长期有效性。要实现永久访问,必须改用正式的OAuth认证流程,脱离对Playground的依赖。

解决方案步骤

1. 配置Google Cloud项目的OAuth同意屏幕

  • 登录Google Cloud控制台,进入你的目标项目
  • 在「API和服务」→「OAuth同意屏幕」中,将应用设置为内部(仅适用于你的Google Workspace域名用户)或外部(需完成审核)
  • 添加所需的API权限范围(比如https://www.googleapis.com/auth/drive.file或https://www.googleapis.com/auth/drive,遵循最小权限原则选择)

2. 用自定义Redirect URI获取长期有效Refresh Token

  • 在Google Cloud控制台的「API和服务」→「凭据」中,创建OAuth客户端ID,设置自定义redirect_uri(本地测试可设为http://localhost:3000/auth/google/callback)
  • 实现完整的OAuth授权流程:
    1. 引导用户访问授权URL,获取授权码
    2. 用授权码兑换access token和refresh token
    3. 将refresh token安全存储(如环境变量、加密数据库)

3. 调整Node.js代码适配正式认证流程

以下是修改后的代码,包含完整授权流程和自动token刷新逻辑:

const { google } = require('googleapis');
const express = require('express');
const app = express();

// 从环境变量读取凭据
const CLIENT_ID = process.env.GOOGLE_CLIENT_KEY;
const CLIENT_SECRET = process.env.GOOGLE_SECRET_KEY;
const REDIRECT_URI = 'http://localhost:3000/auth/google/callback'; // 自定义redirect_uri
const oauth2Client = new google.auth.OAuth2(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);

// 生成授权URL
app.get('/auth/google', (req, res) => {
  const authUrl = oauth2Client.generateAuthUrl({
    access_type: 'offline', // 必须设置此参数才能获取长期refresh token
    scope: ['https://www.googleapis.com/auth/drive.file'], // 根据需求调整权限范围
  });
  res.redirect(authUrl);
});

// 回调路由,兑换token
app.get('/auth/google/callback', async (req, res) => {
  const { code } = req.query;
  try {
    const { tokens } = await oauth2Client.getToken(code);
    oauth2Client.setCredentials(tokens);
    // 将refresh token保存到安全位置,后续可永久使用
    console.log('Refresh Token:', tokens.refresh_token);
    res.send('认证成功,已获取长期有效refresh token');
  } catch (error) {
    console.error('获取token失败:', error);
    res.status(500).send('认证失败');
  }
});

// 上传文件函数(oauth2Client会自动刷新过期的access token)
async function uploadFile(res) {
  try {
    const response = await drive.files.create({
      requestBody: {
        name: `${res}.docx`,
        mimeType: 'application/vnd.google-apps.document',
      },
      media: {
        mimeType: 'application/vnd.google-apps.document',
        body: "you can write in a body field in backend",
      },
    });
    return response.data.id;
  } catch (error) {
    console.log('上传文件失败:', error);
    throw error;
  }
}

const drive = google.drive({ version: 'v3', auth: oauth2Client });

app.listen(3000, () => {
  console.log('服务器运行在http://localhost:3000');
});

4. 保障Refresh Token长期有效

  • 不要频繁撤销OAuth客户端ID或重置用户授权
  • 避免同一用户同一客户端多次授权(重复授权会使旧refresh token失效)
  • 外部应用完成Google OAuth审核后,refresh token通常不会自动过期,除非用户主动撤销授权

关键注意事项

  • access_type: 'offline':生成授权URL时必须设置此参数,否则无法获取refresh token
  • 最小权限原则:只申请必要的API范围,降低安全风险,也更容易通过审核
  • 安全存储:禁止将refresh token硬编码到代码中,使用环境变量或加密存储方案

内容的提问来源于stack exchange,提问作者Sudhanshu Sahu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:45:42