如何获取永不失效的Google OAuth2刷新令牌?(用于Nodemailer发邮件)
关于Nodemailer + Google OAuth2 长期刷新令牌的解决方案
先明确你疑惑的「用户」是谁
这里的「用户」绝对不是访问你应用的前端访客,而是你用来发送邮件的那个Google账号(比如你的业务邮箱账号)。因为你要的是后端固定用一个账号发邮件,不需要让用户授权,整个流程都是围绕你自己的发件账号来做的。
能不能后端配置长期有效的刷新令牌?当然可以
Google确实提供长期有效的刷新令牌,但必须满足几个前提条件,不然拿到的就是短期测试令牌。
如何获取长期有效的刷新令牌?
按以下步骤操作,全程在Google Cloud Console完成,不用依赖OAuthPlayground:
配置OAuth同意屏幕并发布
- 登录Google Cloud Console,创建/选择你的项目。
- 进入「API和服务」→「OAuth同意屏幕」,选择「外部」类型(个人Gmail账号只能选这个,Workspace账号可选内部)。
- 填写必要的应用信息,然后在「范围」里添加
https://mail.google.com/(这个是发邮件的全权限,比窄权限更稳定,避免令牌提前失效)。 - 完成后点击「发布应用」,必须发布成生产模式——测试模式下的刷新令牌只会有效期7天。
创建桌面类型的OAuth客户端ID
- 进入「API和服务」→「凭据」,点击「创建凭据」→「OAuth客户端ID」。
- 应用类型选择「桌面应用」(后端用的话,桌面应用的授权流程不需要前端回调,适合获取离线刷新令牌),填写名称后创建,得到
client_id和client_secret。
手动获取授权码并兑换刷新令牌
- 构造授权URL,替换成你的
client_id:https://accounts.google.com/o/oauth2/v2/auth?client_id=你的客户端ID&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&scope=https://mail.google.com/&access_type=offline&prompt=consent - 把这个URL复制到浏览器,用你要发邮件的Google账号登录,授权后会得到一个授权码(一串字符串)。
- 发送POST请求到
https://oauth2.googleapis.com/token,参数如下(用表单或JSON都可以):{ "client_id": "你的客户端ID", "client_secret": "你的客户端密钥", "code": "刚才拿到的授权码", "redirect_uri": "urn:ietf:wg:oauth:2.0:oob", "grant_type": "authorization_code" } - 返回结果里的
refresh_token就是长期有效的,把它存在后端的配置文件或密钥管理服务里。
- 构造授权URL,替换成你的
注意事项
- 只要你的Google账号不修改密码、不撤销这个应用的权限、Google没有检测到异常操作,这个刷新令牌就会一直有效。
- 不要用OAuthPlayground的令牌,它属于第三方授权通道,令牌有效期短,仅适合快速测试。
- 如果后续令牌失效(比如权限被撤销),只需要重新走一遍授权码兑换流程,获取新的刷新令牌即可。
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

