2017-07-31 46 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瞭解更多信息。