Gmail、nodemailer、OATH2 刷新令牌不起作用
Posted
技术标签:
【中文标题】Gmail、nodemailer、OATH2 刷新令牌不起作用【英文标题】:Gmail, nodemailer, OATH2 refresh token not working 【发布时间】:2018-01-06 19:56:26 【问题描述】:我已将 Nodemailer 设置为使用 OAuth2 与 Gmail 一起使用。在访问令牌过期之前它工作正常。此时,尽管有刷新令牌,但我收到以下错误消息:
Error: Invalid status code 401
at ClientRequest.req.on.res (xxxxxxxxxxx)
at emitOne (events.js:96:13)
at ClientRequest.emit (events.js:191:7)
at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:522:21)
at HTTPParser.parserOnHeadersComplete (_http_common.js:99:23)
at TLSSocket.socketOnData (_http_client.js:411:20)
at emitOne (events.js:96:13)
at TLSSocket.emit (events.js:191:7)
at readableAddChunk (_stream_readable.js:178:18)
at TLSSocket.Readable.push (_stream_readable.js:136:10)
at TLSWrap.onread (net.js:561:20)
type: 'FETCH',
sourceUrl: 'https://accounts.google.com/o/oauth2/token',
code: 'EAUTH',
command: 'AUTH XOAUTH2'
这是我的代码。我还尝试在初始 nodemailer 设置中包含刷新令牌和访问令牌,以及包含到期日期。每次我得到相同的结果。
Nodemailer 设置:
const nodemailer = require('nodemailer')
const transporter = nodemailer.createTransport(
host: 'smtp.gmail.com',
port: 465,
secure: true,
auth:
type: 'OAuth2',
clientId: 'xxxxxxxxxx',
clientSecret: 'xxxxxxxxxx'
);
transporter.on('token', token =>
console.log('A new access token was generated');
console.log('User: %s', token.user);
console.log('Access Token: %s', token.accessToken);
console.log('Expires: %s', new Date(token.expires));
);
电子邮件设置:
const mailOptions =
from: xxxxxxxxx,
to: xxxxxxxxx,
subject: 'Test Subject',
text: 'This is a test',
html: '<p>This is a test</p>',
auth:
user: 'xxxxxxxxxxxx',
refreshToken: 'xxxxxxxxxxxxx',
accessToken: 'xxxxxxxxxxxxx'
电子邮件发送
transporter.sendMail(mailOptions, function(err, info)
if(err)
return console.log(err);
console.log('Message %s sent: %s', info.messageId, info.response)
)
谁能建议可能出了什么问题?
【问题讨论】:
【参考方案1】:查看此SO post 以指导您有关“刷新令牌”的讨论,请参阅RobKohr 和Radioreve 的回答。
也许这个OAuth2 示例可以帮助您检查与您的代码的差异。
来自 Nodemailer 站点的参考:
OAuth2 允许您的应用程序存储和使用身份验证令牌 而不是实际的登录凭据。这对安全性非常有用,因为 令牌或仅对特定操作有效,并且可以轻松撤销 因此,一旦被盗,不会像实际账户那样受到伤害 证书。 Nodemailer 中的 OAuth2 身份验证主要用于 Gmail 和 G Suite(née Google Apps),即使还有其他 提供者也支持它。
OAuth2 身份验证所需的访问令牌是短暂的,因此 这些需要不时再生。 Nodemailer 能够 使用 3LO 和 2LO 自动重新生成令牌,但您 也可以自己处理所有特定的令牌。
您可以参考此SO post 了解更多信息。
【讨论】:
【参考方案2】:我知道我写这篇文章太晚了。但我来到这里是因为我昨天面临同样的问题。我已经解决了这个问题,这个问题是一个愚蠢的错误,没有在任何地方提及。
所以问题是在谷歌游乐场页面中创建刷新令牌和访问令牌的过程中。我选择了正确的范围 (https://mail.google.com)但在创建代码和刷新令牌时,我没有添加我的应用程序客户端 ID 和密码,而谷歌默认使用客户端 ID 和操场密码。因此,请小心在 Playground 中添加应用的客户端 ID 和密码。
添加您的客户 ID 和密码。 点击右上角设置按钮。点击复选框说使用您自己的凭据,然后点击关闭。现在,如果我们创建访问刷新令牌,Google 将请求我们的应用程序而不是 Google Playground 的权限。
它将解决 401 问题。在任何创建的卡片上都没有提到这一点。
【讨论】:
以上是关于Gmail、nodemailer、OATH2 刷新令牌不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Nodemailer、Heroku、Gmail、无效登录 - 在本地工作
带有 Gmail 服务的 Nodemailer 无法在 heroku 上运行
无法通过 nodemailer 发送电子邮件 |发件人“电子邮件 id@gmail.com>”无效
Nodemailer getaddrinfo ENOTFOUND 错误