当我的网站部署在Heroku上时,我正在尝试使用nodemailer发送电子邮件。
对我来说唯一有效的方法是使用Google OAuth。
我遇到的问题是,它仅在更改访问令牌之前有效。在Google OAuth Playground上,我用自己的clientId
和clientSecret
交换了refreshToken
和accessToken
。它为我生成了该代码,并且还有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' }
答案 0 :(得分:2)
如果您使用的是Google Auth,请按以下步骤操作:令牌应至少在一个小时内失效(1小时= 3600 s)。这是默认行为-您无法更改到期阈值。
但是,到最后,您可以编写一段代码以从触发时间起每隔一小时触发一次OAuth的提取。然后,您可以在代码中散发刷新的值。
我不确定为什么要发送刷新令牌和访问令牌。您可能只希望发送其中一个。虽然访问令牌最多会在一个小时内过期,但刷新令牌不会过期-它的寿命很长。刷新令牌反而会为您刷新访问令牌:因此您不必每次都触发它。
在这里查看:OWASP project
但是,如果您希望继续使用access_token
,则可以浏览以下小节:OAuth2 with Nodemailer。
也许您可以利用参数renew
的值,据此可以编写生成新访问令牌所需的逻辑。