javascript - Gmail、nodemailer、OATH2 刷新 token 不起作用

标签 javascript node.js oauth-2.0 gmail-api nodemailer

我已将 Nodemailer 设置为使用 OAuth2 与 Gmail 一起工作。它工作正常,直到访问 token 过期。此时,尽管有刷新 token ,但我收到以下错误消息:

{ 
    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 设置中包括刷新 token 和访问 token ,以及包括到期日期。每次我得到相同的结果。

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

谁能指出可能出了什么问题?

最佳答案

我知道我写这篇文章太晚了。但是我昨天遇到同样的问题时来到这里。我已经解决了这个问题,这个问题是一个愚蠢的错误,在任何地方都没有提到。

因此问题出在在 google playground 页面中创建刷新 token 和访问 token 的过程中。我选择了正确的范围 (https://mail.google.com)但是在创建代码和刷新 token 时我没有添加我的应用程序客户端 ID 和密码,谷歌默认使用客户端 ID 和 Playground 密码。所以请小心在 playground 中添加您应用的客户端 ID 和密码。

添加您的客户端 ID 和密码。 点击右上角设置按钮。点击显示使用您自己的凭据的复选框,然后点击关闭。现在,如果我们创建访问刷新 token ,Google 将向我们的应用请求许可,而不是 Google Playground。

它将解决 401 问题。在创建的任何卡片上都没有提到这一点。

关于javascript - Gmail、nodemailer、OATH2 刷新 token 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45412584/

相关文章:

javascript - 关于JavaScript中闭包/封装效率的问题

node.js - 仅在对 master 发出合并请求时运行 gitlab-ci.yml

Javascript条件逻辑nodejs

oauth-2.0 - 开发和生产中的 OAuth2

javascript - 动态引用导入

javascript - 如果悬停并按下shift键切换背景?

Javascript ES6 类组成

javascript - 使用 Socket.io 将套接字传递给 Node.js 中的模块

oauth - child 在 OAuth 2.0 流程上不匹配

ios - 在 iPhone 上使用 OAuth2 访问 Google Calendar API