javascript - 将 Nodemailer 与 Google OAuth 结合使用

标签 javascript node.js heroku nodemailer

当我的站点部署在 Heroku 上时,我正在尝试使用 nodemailer 发送电子邮件。

唯一对我有用的就是使用 Google OAuth。

我遇到的问题是,它只在访问 token 更改之前有效。在 Google OAuth Playground 上,我使用自己的 clientIdclientSecret 来换取 refreshTokenaccessToken。它为我生成了那个,还有 3600 秒的到期时间。它在那段时间有效,但之后无效。可以防止它过期吗?还有其他方法可以让它与 Heroku 一起使用吗?

服务器代码上的 Nodemailer:

const transporter = nodemailer.createTransport({
  host: 'smtp.gmail.com',
  port: 465,
  secure: true,
  auth: {
    type: 'OAuth2',
    user: 'beyondutraining@gmail.com',
    clientId: keys.clientID,
    clientSecret: keys.clientSecret,
    refreshToken: keys.refreshToken,
    accessToken: keys.accessToken
  }
})

访问 token 过期后的错误:

{ Error: Invalid status code 400
at ClientRequest.req.on.res 
(/app/node_modules/nodemailer/lib/fetch/index.js:221:23)
at emitOne (events.js:116:13)
at ClientRequest.emit (events.js:211:7)
at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:543:21)
at HTTPParser.parserOnHeadersComplete (_http_common.js:112:17)
at TLSSocket.socketOnData (_http_client.js:440:20)
at emitOne (events.js:116:13)
at TLSSocket.emit (events.js:211:7)
at addChunk (_stream_readable.js:263:12)
at readableAddChunk (_stream_readable.js:250:11)
type: 'FETCH',
sourceUrl: 'https://accounts.google.com/o/oauth2/token',
code: 'EAUTH',
command: 'AUTH XOAUTH2' }

Github source code

最佳答案

如果您使用的是 Google Auth,请注意: token 应该在最多一个小时后过期(1 小时 = 3600 秒)。这是默认行为 - 您无法更改到期阈值。

但是,在您这边,您可以编写一段代码,从触发时间起每隔一小时触发一次 OAuth 提取。然后您可以在代码中循环刷新的值。

我不确定您为什么要同时发送刷新 token 和访问 token 。您可能希望只发送其中一个。虽然访问 token 最多在一小时后过期,但刷新 token 不会——它存在很长时间。刷新 token 会为您刷新访问 token :因此您不必每次都触发它。

看这里:OAuth2 with Nodemailer

但是,如果您希望继续使用 access_token,您可以浏览以下小节:Custom OAuth Handling .

也许您可以利用参数 renew 的值,您可以根据它编写生成新访问 token 所需的逻辑。

关于javascript - 将 Nodemailer 与 Google OAuth 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51342952/

相关文章:

python - 如何从时钟进程 Heroku Flask 访问我的 PostgreSQL 数据库?

javascript - 如何解析对象的字符串?

javascript - Android 网页 View : console is not defined

node.js - npm start Microsoft JScript 运行时错误 800A138F 需要对象

node.js - VueJS : Use directive in component with vue-loader

docker - 如何在 Heroku 上部署 dockerized 应用程序?

java - 用标签替换每个单词

javascript - 将文本框的父名称和 id 附加到新生成的文本框

javascript - 在 node.js 中使用按键启动操作

ruby-on-rails - 在 Heroku 上运行 Rails 4 应用程序时出现问题