Node.js对接YouTube API v3快速入门示例认证错误问题咨询
错误原因
你遇到的invalid_grant报错核心是谷歌官方旧教程严重过时,核心问题有两个:
- 谷歌在2022年正式废弃了OOB(Out-of-Band)授权模式,也就是教程代码里用到的
urn:ietf:wg:oauth:2.0:oob重定向URI,现在这种模式下拿到的授权码默认无效 - 未发布的测试状态OAuth应用,只有在「OAuth同意屏幕」中被添加为测试用户的账号才能完成授权,你之前添加测试用户的操作只解决了授权页面访问权限的问题,没有解决OOB废弃的核心问题。
解决方案
第一步:调整谷歌云控制台配置
- 打开谷歌云控制台的「API和服务-凭据」页面,找到你创建的桌面应用OAuth客户端ID
- 进入「OAuth同意屏幕」页面,确认你用来授权的邮箱已经被添加到测试用户列表中
- 回到OAuth客户端ID的编辑页面,在「已获授权的重定向URI」中添加
http://127.0.0.1:3000/oauth2callback,保存配置后重新下载client_secret.json文件替换项目中的旧文件 - 删除本地已缓存的旧凭证文件:路径为
~/.credentials/youtube-nodejs-quickstart.json(Windows系统对应C:\Users\你的用户名\.credentials\youtube-nodejs-quickstart.json)
第二步:修改授权逻辑代码
先执行npm install open安装自动打开浏览器的依赖,再把原来getNewToken函数的逻辑替换为本地端口监听回调获取授权码的逻辑,适配新的重定向规则:
const http = require('http'); const url = require('url'); const opn = require('open'); function getNewToken(oauth2Client, callback) { const authUrl = oauth2Client.generateAuthUrl({ access_type: 'offline', scope: SCOPES, prompt: 'consent' // 强制显示同意页面,确保返回刷新令牌 }); console.log('即将打开浏览器进行授权,如果没有自动打开,请手动访问以下地址: ', authUrl); // 启动临时本地服务监听授权回调 const server = http.createServer(async (req, res) => { try { if (req.url.indexOf('/oauth2callback') > -1) { const qs = new url.URL(req.url, 'http://localhost:3000').searchParams; const code = qs.get('code'); res.end('授权成功,可以关闭当前页面回到控制台查看结果'); server.close(); oauth2Client.getToken(code, function(err, token) { if (err) { console.log('获取访问令牌出错: ', err); return; } oauth2Client.credentials = token; storeToken(token); callback(oauth2Client); }); } } catch (e) { console.log('处理授权回调出错: ', e); } }).listen(3000, () => { opn(authUrl); }); }
同时修改authorize函数中的重定向地址赋值,确保和你在谷歌云控制台配置的重定向地址一致:
// 把原来从credentials里读取redirectUrl的逻辑替换为 var redirectUrl = 'http://localhost:3000/oauth2callback';
第三步:验证运行
重新执行node quickstart.js,会自动打开浏览器进行授权,授权完成后自动获取令牌,不需要手动复制授权码。
常见排查点
- 授权码有效期只有5分钟,不要长时间停留在授权页面
- 不要重复使用同一个授权码,每次授权失败都要重新运行程序生成新的授权链接
- 确认你的谷歌云项目已经启用了YouTube Data API v3服务,没有启用会额外触发权限报错
内容的提问来源于stack exchange,提问作者YenBenLemon
相关产品推荐
相关产品推荐

