使用Node.js获取AdWords API刷新令牌的技术问询
解决Node.js环境下AdWords API刷新令牌获取的问题
我之前折腾AdWords API的时候也踩过这个坑,官方的封装库把OAuth流程藏得太深,新手确实容易摸不着头脑。而且AdWords的OAuth流程和YouTube的细节上还有点不一样,下面我把自己摸索出来的方法和逻辑拆解给你:
一、先搞懂AdWords OAuth的核心逻辑
AdWords用的是OAuth 2.0授权码流程,要拿到刷新令牌,必须走完完整的三步:
- 生成授权URL,引导用户用AdWords关联的Google账号授权你的应用
- 用户授权后,Google返回一个一次性的授权码
- 用授权码去交换「访问令牌+刷新令牌」,后续就靠刷新令牌定期续期访问令牌
二、手动实现刷新令牌获取(比看库源码更直观)
如果你想搞透底层逻辑,完全可以不用封装库,用google-auth-library自己写:
准备OAuth客户端信息
先去Google Cloud Console创建项目、启用AdWords API,然后创建「桌面应用」类型的OAuth客户端ID(Node脚本属于命令行应用,选这个类型),拿到client_id和client_secret。初始化客户端:
const { OAuth2Client } = require('google-auth-library'); const oAuth2Client = new OAuth2Client( '你的CLIENT_ID', '你的CLIENT_SECRET', 'urn:ietf:wg:oauth:2.0:oob' // 桌面应用固定回调URL,不用改 );生成授权URL(关键参数别漏)
const authUrl = oAuth2Client.generateAuthUrl({ access_type: 'offline', // 必须加这个!否则拿不到刷新令牌 scope: 'https://www.googleapis.com/auth/adwords', // AdWords专属权限范围 }); console.log('请打开下面的URL授权:', authUrl);这里
access_type: 'offline'是重中之重,很多人就是漏了这个参数,导致Google只返回访问令牌,不给刷新令牌。用授权码交换令牌
打开上面的URL,登录你的AdWords经理账号(注意:必须是经理账号,普通广告账号没法生成有效令牌),授权后会得到一串授权码。把这串码输入到脚本里:const readline = require('readline').createInterface({ input: process.stdin, output: process.stdout }); readline.question('请输入授权码:', async (code) => { const { tokens } = await oAuth2Client.getToken(code); console.log('拿到的令牌信息:', tokens); // tokens里会包含refresh_token,把它存到配置文件或数据库里,别硬编码 oAuth2Client.setCredentials(tokens); readline.close(); });运行脚本,就能拿到包含刷新令牌的完整令牌对象了。
三、理解封装库的自动刷新逻辑
比如常用的node-adwords或者google-ads-api库,其实是把上面的流程封装了:
- 你初始化库的时候传入
client_id、client_secret和refresh_token - 当访问令牌过期时,库会自动调用Google的令牌刷新接口,用你存的
refresh_token换全新的访问令牌,这个过程是后台自动完成的,所以你看不到显式的刷新代码
四、踩过的几个坑
- 必须用AdWords经理账号授权:普通广告账号没有API授权权限,一定要关联到经理账号
- 刷新令牌的有效期:只要用户不主动撤销授权、你不重置客户端ID,刷新令牌是长期有效的,所以要安全存储
- 权限范围别选错:一定要用
https://www.googleapis.com/auth/adwords,别用其他API的scope
希望这些内容能帮你解决刷新令牌的问题!
内容的提问来源于stack exchange,提问作者Alex Ironside
相关产品推荐
相关产品推荐

