将Nodemailer与Google OAuth结合使用

时间:2018-07-14 20:04:50

标签: javascript node.js heroku nodemailer

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

对我来说唯一有效的方法是使用Google OAuth。

我遇到的问题是,它仅在更改访问令牌之前有效。在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
  }
})

访问令牌过期后出现错误:

{ 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

1 个答案:

答案 0 :(得分:2)

如果您使用的是Google Auth,请按以下步骤操作:令牌应至少在一个小时内失效(1小时= 3600 s)。这是默认行为-您无法更改到期阈值。

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

我不确定为什么要发送刷新令牌和访问令牌。您可能只希望发送其中一个。虽然访问令牌最多会在一个小时内过期,但刷新令牌不会过期-它的寿命很长。刷新令牌反而会为您刷新访问令牌:因此您不必每次都触发它。

在这里查看:OWASP project

但是,如果您希望继续使用access_token,则可以浏览以下小节:OAuth2 with Nodemailer

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