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

使用googleapis NodeJS首次生成Token时遇invalid_grant(400错误)

解决Node.js中googleapis库兑换授权码出现bad_request错误的问题

可能的原因及解决方案

1. 不必要的授权码解码操作

你的代码中对输入的授权码执行了decodeURIComponent(code),但通常从浏览器地址栏复制的授权码已经是解码后的状态。重复解码会破坏授权码的格式,导致Google服务器无法识别,触发bad_request。

修复方法:移除解码步骤,直接使用原始输入的授权码:

// 移除这一行:const cleanCode = decodeURIComponent(code);
const { tokens } = await oAuth2Client.getToken(code);

2. 重定向URI完全匹配问题

确保Google控制台中配置的重定向URI与credentials.json里的redirect_uris[0]完全一致,包括是否带结尾斜杠、协议(http/https)、端口号。例如:

  • 控制台配置:http://localhost:3000
  • credentials.json里的redirect_uris必须也是http://localhost:3000,不能是http://localhost:3000/或http://127.0.0.1:3000

3. 授权码过期

授权码的有效期仅为10分钟,若复制后间隔太久才输入,会导致授权码失效。此时需要重新生成授权URL,获取新的授权码再尝试兑换。

4. 客户端凭据类型不匹配

确认credentials.json对应的是Google控制台中创建的Web应用类型凭据。如果误使用了桌面应用或其他类型的凭据,会导致令牌兑换失败。

  • 若你的应用是外部用户访问(未发布状态),需确保在OAuth consent screen中添加了测试用户,且使用测试用户的账号进行授权。
  • 已添加的权限范围需与代码中SCOPES完全一致,且所有范围都已在控制台中声明。

修复后的核心代码片段

rl.question('Enter the authorization code here: ', async (code) => {
  rl.close();

  try {
    console.log('🔄 Exchanging authorization code for tokens...');

    // 直接使用原始code,无需解码
    const { tokens } = await oAuth2Client.getToken(code);

    oAuth2Client.setCredentials(tokens);
    fs.writeFileSync(CONFIG.TOKEN_PATH, JSON.stringify(tokens, null, 2));

    console.log('✅ Token stored successfully to:', CONFIG.TOKEN_PATH);
    console.log('✅ Authorization complete! You can now use the YouTube API.');

    resolve(tokens);
  } catch (error) {
    console.error('❌ Error retrieving access token:', error);
    reject(error);
  }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 21:43:14