Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Gmail、NodeEmailer、OATH2刷新令牌不工作_Javascript_Node.js_Oauth 2.0_Gmail Api_Nodemailer - Fatal编程技术网

Javascript Gmail、NodeEmailer、OATH2刷新令牌不工作

Javascript Gmail、NodeEmailer、OATH2刷新令牌不工作,javascript,node.js,oauth-2.0,gmail-api,nodemailer,Javascript,Node.js,Oauth 2.0,Gmail Api,Nodemailer,我已经使用OAuth2设置了nodeEmailer来处理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)

我已经使用OAuth2设置了nodeEmailer来处理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' 
}
这是我的密码。我还尝试在初始NodeEmailer设置中包括刷新令牌和访问令牌,以及包括到期日期。每次我都得到同样的结果

节点电子邮件程序设置:

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'
    }
}
有人能提出可能出现的问题吗?

检查此项以指导您有关“刷新令牌”的讨论,请参阅和的答案

也许这些示例可以帮助您检查与代码的差异

来自NodeEmailer站点的参考:

OAuth2允许应用程序存储和使用身份验证令牌 而不是实际的登录凭据。这对于安全性也是非常好的 令牌或仅对特定操作有效,可以轻松撤销 因此,一旦被盗,就不能像实际账户那样造成伤害 资格证书NodeEmailer中的OAuth2身份验证主要用于 Gmail和G套件(不包括谷歌应用程序),尽管还有其他 也支持它的提供商

OAuth2身份验证所需的访问令牌是短期的,因此 这些需要不时地重新生成。NodeEmailer能够 使用3LO和2LO自动重新生成令牌,但您 还可以自己处理所有特定于令牌的事务


你可以参考这篇文章了解更多信息。

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

所以问题是在谷歌游乐场页面中创建刷新令牌和访问令牌的过程中。我选择了正确的作用域(),但在创建代码和刷新令牌时,我没有添加我的应用程序客户端id和密码,谷歌默认使用的是客户端id和游乐场密码。因此,在操场上添加应用程序的客户端id和密码时要小心

添加您的客户端id和密码单击右上角的设置按钮。单击“使用您自己的凭据”复选框,然后单击“关闭”。现在,如果我们创建访问刷新令牌,谷歌将请求我们的应用程序而不是谷歌游乐场的许可

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

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