Nodemailer с аутентификацией GMail SMTP OAuth2 выдает мне `` Недействительный код состояния 401 ''

Я пытаюсь сделать простого отправителя почты с помощью Nodemailer 3, API GMail с аутентификацией OAuth2.

Вот мой сценарий:

var serverConfig  = {
  gmail: {
      client_user : '[email protected]',
      client_id : '349...myClientId',
      secret : 'mysecret..123jd123',
      refresh_token : 'x/xxxxxxxxxxxxxx-reZuEMeSuJaSERmCVY',
      access_token : 'xxxxxxxxxxxxxxxxx',
      expires: '3599'
  }
}

// 3LO authentication https://nodemailer.com/smtp/oauth2/#example-3
var transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    type: 'OAuth2',
    user: serverConfig.gmail.client_user,
    clientId: serverConfig.gmail.client_id,
    clientSecret: serverConfig.gmail.secret,
    refreshToken: serverConfig.gmail.refresh_token
  },
});

module.exports = {
    "send": function(_from,_to,_subject,_html,_text){
      // setup email data with unicode symbols
      var mailOptions = {
          from: _from,
          to: _to, // list of receivers
          subject: _subject, // Subject line
          html: _html, // html body
          text: _text // plain text body
      };

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


}

Когда я принудительно использую access_token в объекте аутентификации, электронное письмо отправляется без каких-либо проблем. Но когда я не указываю access_token, только de refresh_token, я получаю эту ошибку:

{ Error: Invalid status code 401
    at ClientRequest.req.on.res (/myproject/node_modules/nodemailer/lib/fetch/index.js:193:23)
    at emitOne (events.js:96:13)
    at ClientRequest.emit (events.js:188:7)
    at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:474:21)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:99:23)
    at TLSSocket.socketOnData (_http_client.js:363:20)
    at emitOne (events.js:96:13)
    at TLSSocket.emit (events.js:188:7)
    at readableAddChunk (_stream_readable.js:176:18)
    at TLSSocket.Readable.push (_stream_readable.js:134:10)
  type: 'FETCH',
  sourceUrl: 'https://accounts.google.com/o/oauth2/token',
  code: 'EAUTH',
  command: 'AUTH XOAUTH2' }

person Santiago Barchetta    schedule 10.03.2017    source источник
comment
я делаю копия этого вопроса в Stack Overflow на испанском языке   -  person Santiago Barchetta    schedule 10.03.2017
comment
Вы в этом разобрались? Такая же проблема. Я также не знаю, откуда у вас refreshToken. Разве это не отправлено в ответ?   -  person ironicaldiction    schedule 01.04.2017
comment
Не совсем. Я решил использовать простую аутентификацию SMPT.   -  person Santiago Barchetta    schedule 03.04.2017
comment
Ах я вижу. Я заставил его работать с OAuth2 после того, как часами бился головой о стену: см. Мой ответ здесь stackoverflow.com/questions/26196467/   -  person ironicaldiction    schedule 04.04.2017


Ответы (2)


Может быть, уже слишком поздно, но просто отвечу здесь, если кто-то столкнется с той же проблемой. Моя проблема исправлена ​​после сброса refreshToken. В этой статье говорится отличные инструкции для всего процесса

person Yohan Blake    schedule 27.10.2017
comment
статья пропала :( - person Kirby; 28.01.2018
comment
Можете ли вы перепостить ссылку на статью, если это возможно? - person ; 14.05.2018
comment
извините, ребята, автор, если эта статья сняла его. Надеюсь, эти две ссылки помогут вам community.nodemailer.com/2- 0-0-beta / setup-smtp community.nodemailer.com - person Yohan Blake; 17.05.2018

Я смог исправить это, перейдя на https://console.cloud.google.com/apis/credentials, выбрав правильный идентификатор клиента OAuth 2.0 и выбрав «Сбросить секрет» вверху. Это отменило мой старый секрет и сгенерировало новый, который я затем использовал в OAuth Playground для обмена на токен обновления. Я поместил новый секрет клиента и токен обновления в объект аутентификации для nodemailer, и он снова начал работать.

person Hank    schedule 27.05.2021