使用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应用类型凭据。如果误使用了桌面应用或其他类型的凭据,会导致令牌兑换失败。
5. OAuth consent screen配置问题
- 若你的应用是外部用户访问(未发布状态),需确保在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
相关产品推荐
相关产品推荐

