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

如何获取GoogleAuth.getAccessToken返回令牌的过期时间并刷新?

解决Google Auth令牌存储与过期检测问题

要获取包含过期信息的令牌,你需要改用GoogleAuth.getClient()方法,而非getAccessToken()——后者仅返回纯令牌字符串,前者返回的客户端实例会携带完整凭据信息,包括过期时间戳。

1. 获取带过期信息的凭据

替换原代码,通过getClient()提取完整凭据:

const {GoogleAuth} = require('google-auth-library');

const retailAuth = new GoogleAuth({
  keyFile: './credential.json',
  scopes: ['https://www.googleapis.com/auth/cloud-platform'],
});

// 获取客户端实例,从中提取令牌和过期时间
const authClient = await retailAuth.getClient();
const { access_token, expiry_date } = authClient.credentials;
// expiry_date 是毫秒级时间戳,代表令牌到期的具体UTC时间

2. 将凭据存储到Firebase Firestore

把令牌和过期时间一同存入Firestore,方便后续复用:

const admin = require('firebase-admin');
// 假设已完成Firebase Admin SDK初始化

async function saveTokenToFirestore(token, expiryDate) {
  await admin.firestore()
    .collection('auth_tokens')
    .doc('retail_api_token')
    .set({
      access_token: token,
      expiry_date: expiryDate,
      updated_at: admin.firestore.FieldValue.serverTimestamp()
    });
}

// 调用存储函数
await saveTokenToFirestore(access_token, expiry_date);

3. 复用令牌并检测过期

每次使用令牌前,先从Firestore读取存储的凭据,判断是否即将过期(建议留5-10分钟缓冲时间,避免网络延迟导致令牌刚用就失效):

async function getValidAccessToken() {
  const tokenDoc = await admin.firestore()
    .collection('auth_tokens')
    .doc('retail_api_token')
    .get();

  if (!tokenDoc.exists) {
    // 无存储令牌,重新生成并存储
    const authClient = await retailAuth.getClient();
    const { access_token, expiry_date } = authClient.credentials;
    await saveTokenToFirestore(access_token, expiry_date);
    return access_token;
  }

  const { access_token, expiry_date } = tokenDoc.data();
  const now = Date.now();
  const bufferTime = 5 * 60 * 1000; // 5分钟缓冲时长

  // 判断令牌是否已过期或即将过期
  if (now + bufferTime >= expiry_date) {
    // 重新生成令牌并更新存储
    const authClient = await retailAuth.getClient();
    const newToken = authClient.credentials.access_token;
    const newExpiry = authClient.credentials.expiry_date;
    await saveTokenToFirestore(newToken, newExpiry);
    return newToken;
  }

  // 令牌有效,直接返回使用
  return access_token;
}

// 使用示例
const validToken = await getValidAccessToken();
// 用validToken发起Google API请求

关键说明

  • expiry_date是毫秒级时间戳,直接与当前时间Date.now()对比即可判断过期状态。
  • 设置缓冲时间很关键:避免因网络请求耗时,导致令牌在请求过程中过期,可根据你的API请求耗时调整缓冲时长。
  • 若仅在单实例运行服务,Google Auth客户端本身会自动缓存令牌,无需手动存储到Firestore;跨服务/实例复用令牌时,才需要手动持久化存储。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:35:16