2017-07-31 28 views
0

我已经将Nodemailer设置为使用OAuth2与Gmail一起使用。它工作正常,直到访问令牌到期。在这一点上,尽管有一个刷新令牌,我得到了以下错误消息:Gmail,nodemailer,OATH2刷新令牌不起作用

{ 
    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' 
    } 
} 

发送E-mail

transporter.sendMail(mailOptions, function(err, info){ 
    if(err){ 
     return console.log(err); 
    } 
    console.log('Message %s sent: %s', info.messageId, info.response) 
}) 

任何人都可以提出什么可能去错了吗?

回答

0

检查此SO post以引导您了解关于“刷新标记”的讨论,请参阅RobKohrRadioreve的答案。

也许这OAuth2样本可以帮助你检查你的代码的差异。从Nodemailer网站

参考:

OAuth2用户允许应用程序存储和使用认证令牌 ,而不是实际的登录凭据。这对于安全性很好,因为 代币或只对特定动作有效,并且可以很容易地被撤销。因此,一旦被盗,不能像实际账户 凭证那样造成多大伤害。 Nodemailer中的OAuth2身份验证主要与 Gmail和G Suite(适用于Google Apps)一起使用,即使其他 提供商也支持该身份验证。

OAuth2身份验证所需的访问令牌很短,因此需要不时重新生成这些令牌。 Nodemailer能够使用3LO和2LO来自动重新生成令牌,但您也可以自行处理所有令牌。

您可以参考此SO post了解更多信息。