簡體   English   中英

Gmail、nodemailer、OATH2 刷新令牌不起作用

[英]Gmail, nodemailer, OATH2 refresh token not working

我已經將 Nodemailer 設置為使用 OAuth2 處理 Gmail。 它可以正常工作,直到訪問令牌過期。 此時,盡管有刷新令牌,但我收到以下錯誤消息:

{ 
    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 設置中包含刷新令牌和訪問令牌,以及包含到期日期。 每次我都得到相同的結果。

節點郵件程序設置:

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

電子郵件發送

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

任何人都可以建議可能出了什么問題嗎?

檢查此SO 帖子以指導您有關“刷新令牌”的討論,請參閱RobKohrRadioreve 的答案。

也許這個OAuth2示例可以幫助您檢查與您的代碼的差異。

來自 Nodemailer 站點的參考:

OAuth2 允許您的應用程序存儲和使用身份驗證令牌而不是實際的登錄憑據。 這對於令牌的安全性非常有用,或者僅對特定操作有效,並且可以輕松撤銷,因此一旦被盜,不會像實際帳戶憑據那樣造成太大的傷害。 Nodemailer 中的 OAuth2 身份驗證主要用於 Gmail 和 G Suite(原名 Google Apps),即使還有其他提供商也支持它。

OAuth2 身份驗證所需的訪問令牌是短暫的,因此需要不時重新生成這些令牌。 Nodemailer 能夠同時使用 3LO 和 2LO 來自動重新生成令牌,但您也可以自己處理所有特定於令牌的令牌。

您可以參考此SO 帖子以獲取更多信息。

我知道我在這篇文章上為時已晚。 但我來到這里是因為我昨天面臨同樣的問題。 我已經解決了這個問題,這個問題是一個愚蠢的錯誤,在任何地方都沒有提到。

所以問題是在谷歌游樂場頁面中創建刷新令牌和訪問令牌的過程中。 我選擇了正確的范圍( https://mail.google.com ),但是在創建代碼和刷新令牌時,我沒有添加我的應用程序客戶端 ID 和密碼,谷歌默認使用客戶端 ID 和操場密碼 因此,請小心在操場中添加您的應用程序的客戶端 ID 和機密。

添加您的客戶端 ID 和密碼。 單擊右上角的設置按鈕。 單擊復選框說使用您自己的憑據,然后單擊關閉。 現在,如果我們創建訪問刷新令牌,Google 將請求我們的應用程序而不是 Google Playground 的許可。

它將解決 401 問題。 在創建的任何卡片上都沒有提到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM