为啥我收到错误“无法生成令牌。使用 Nodemailer 时检查您的身份验证选项?

Posted

技术标签:

【中文标题】为啥我收到错误“无法生成令牌。使用 Nodemailer 时检查您的身份验证选项?【英文标题】:Why am I getting the error 'Can't generate token. Check your auth options' when using Nodemailer?为什么我收到错误“无法生成令牌。使用 Nodemailer 时检查您的身份验证选项? 【发布时间】:2020-11-09 05:47:57 【问题描述】:

我看到几个关于正常 OATH 的类似问题。但是,我决定尝试新的 nodemailers 支持 gmail 服务帐户的功能。我一遍又一遍地遇到相同的错误,并且不知道如何解决它。有人有什么见解吗?

第 1 步:我从我的项目中设置了我的服务帐号。然后我下载了key.json文件。

第 2 步:我转到 GCP API 并为我的项目启用了 gmail api。然后我验证了我的新服务帐户在列表中。 (我不想发布图片,因为它包含敏感信息。但我三次检查它是否在为 gmail api 启用的服务帐户列表中。

第 3 步:我写了一点代码。

return Promise.resolve()
.then(() => 
      const mailTransport = nodemailer.createTransport(
        service: 'gmail',
        auth: 
          type: 'OAuth2',
          user: <service account email>,
          serviceClient: <service account client>,
          privateKey: <Private key> (including the \n at the end),
        ,
      );
)
.then(() => 
        const mailOptions = 
            from: '"Support" support@myapp.com',
            to: targetEmail,
            subject: 'My Subject',
            html: 'My super support email'
          ;
          return mailTransport.sendMail(mailOptions);
    )
.catch(err => 
  console.error(err);
)

我打印了一个很棒的错误提示

Error  Error: Can't generate token. Check your auth options
at SMTPConnection._handleXOauth2Token (/workspace/node_modules/nodemailer/lib/smtp-connection/index.js:1697:27)
at SMTPConnection.login (/workspace/node_modules/nodemailer/lib/smtp-connection/index.js:540:22)
at XOAuth2.generateToken (/workspace/node_modules/nodemailer/lib/xoauth2/index.js:170:33)
at XOAuth2.getToken (/workspace/node_modules/nodemailer/lib/xoauth2/index.js:123:18)
at connection.connect (/workspace/node_modules/nodemailer/lib/smtp-transport/index.js:374:32)
at SMTPConnection.once (/workspace/node_modules/nodemailer/lib/smtp-connection/index.js:215:17)
at Object.onceWrapper (events.js:286:20)
at SMTPConnection.emit (events.js:198:13)
at SMTPConnection.EventEmitter.emit (domain.js:466:23)
at SMTPConnection._actionEHLO (/workspace/node_modules/nodemailer/lib/smtp-connection/index.js:1313:14) code: 'EAUTH', command: 'AUTH XOAUTH2' 

有人知道我做错了什么吗?

注意:更多上下文。这在 firebase 函数内部运行。

【问题讨论】:

您找到解决方案了吗?有同样的问题 没有。我认为它与将服务帐户绑定到真实邮件帐户有关。但没有运气 【参考方案1】:

就我而言(并在 nodemailer 的文档中找到),我没有粘贴整个 private_key,包括最开始的 '-----BEGIN PRIVATE KEY-----\n...')

【讨论】:

【参考方案2】:

我刚遇到同样的问题,在这里找到了解决方案:

https://levelup.gitconnected.com/multi-purposes-mailing-api-using-nodemailer-gmail-google-oauth-28de49118d77

如教程中所述,您必须获取刷新令牌。

在您的 Google API 控制台中的 OAuth 凭据中,提供 https://developers.google.com/oauthplayground/ 作为重定向 URI。

转到https://developers.google.com/oauthplayground/ 页面。

在设置菜单的右上角选择“使用您自己的 OAuth 凭据”并提供您的凭据。

然后在“Select & Authorize APIs”部分提供链接https://mail.google.com,然后点击“Authorize APIs”按钮。

最后用授权码换取令牌。

当您拥有刷新令牌时,您可以在配置中传递它:


    service: 'gmail',
    auth: 
        type: 'OAuth2',
        user: USER_EMAIL_ADDRESS,
        clientId: CLIENT_ID,
        clientSecret: CLIENT_SECRET,
        refreshToken: REFRESH_TOKEN,
    ,

根据这个答案,谷歌的刷新令牌不会过期:

Do Google refresh tokens expire?

最好的问候,

彼得

【讨论】:

您提供的第一个链接似乎不存在。这是一个错误吗? 也许这是一个暂时的问题。链接应该没问题。我在不同的设备上检查过,它工作正常。 他们最近改变了它的工作方式吗?我使用的旧方法像 2 个月前一样工作得很好(我不检查经常 XD 的电子邮件功能),直到现在才注意到它不再工作了。感谢您的回答,它再次起作用了

以上是关于为啥我收到错误“无法生成令牌。使用 Nodemailer 时检查您的身份验证选项?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我收到“无法解析 NSPredicate”错误

为啥我收到 AbstractDynamicObject$CustomMessageMissingMethodException 错误?

为啥我收到错误“尝试打开未关闭的连接。”?

为啥我收到“由于保护级别而无法访问”错误?

为啥我收到的 jwt 格式错误?

为啥我收到 Laravel php artisan 迁移错误?