错误:无效登录:需要应用程序专用密码

Posted

技术标签:

【中文标题】错误:无效登录:需要应用程序专用密码【英文标题】:Error: Invalid login: Application-specific password required 【发布时间】:2020-06-27 07:51:21 【问题描述】:

我想在用户使用 Cloud-Function 和 Firebase 身份验证登录时发送欢迎通知 所以我使用 nodejs CLI 并运行代码

我的 index.js 文件 '使用严格';

    const functions = require('firebase-functions');
    const nodemailer = require('nodemailer');
    // Configure the email transport using the default SMTP transport and a GMail account.
    // For Gmail, enable these:
    // 1. https://www.google.com/settings/security/lesssecureapps
    // 2. https://accounts.google.com/DisplayUnlockCaptcha
    // For other types of transports such as Sendgrid see https://nodemailer.com/transports/
    // TODO: Configure the `gmail.email` and `gmail.password` Google Cloud environment variables.

    const gmailEmail = functions.config().gmail.email;
    const gmailPassword = functions.config().gmail.password;
    const mailTransport = nodemailer.createTransport(
      service: 'gmail',
      auth: 
        user: gmailEmail,
        pass: gmailPassword,
      ,
    );

    // Your company name to include in the emails
    // TODO: Change this to your app or company name to customize the email sent.
    const APP_NAME = 'Cloud Storage for Firebase quickstart';

    // [START sendWelcomeEmail]
    /**
     * Sends a welcome email to new user.
     */
    // [START onCreateTrigger]
    exports.sendWelcomeEmail = functions.auth.user().onCreate((user) => 
    // [END onCreateTrigger]
      // [START eventAttributes]
      const email = user.email; // The email of the user.
      const displayName = user.displayName; // The display name of the user.
      // [END eventAttributes]

      return sendWelcomeEmail(email, displayName);
    );
    // [END sendWelcomeEmail]

    // [START sendByeEmail]
    /**
     * Send an account deleted email confirmation to users who delete their accounts.
     */
    // [START onDeleteTrigger]
    exports.sendByeEmail = functions.auth.user().onDelete((user) => 
    // [END onDeleteTrigger]
      const email = user.email;
      const displayName = user.displayName;

      return sendGoodbyeEmail(email, displayName);
    );
    // [END sendByeEmail]

    // Sends a welcome email to the given user.
    async function sendWelcomeEmail(email, displayName) 
      const mailOptions = 
        from: `$APP_NAME <noreply@firebase.com>`,
        to: email,
      ;

      // The user subscribed to the newsletter.
      mailOptions.subject = `Welcome to $APP_NAME!`;
      mailOptions.text = `Hey $displayName || ''! Welcome to $APP_NAME. I hope you will enjoy our service.`;
      await mailTransport.sendMail(mailOptions);
      console.log('New welcome email sent to:', email);
      return null;
    

    // Sends a goodbye email to the given user.
    async function sendGoodbyeEmail(email, displayName) 
      const mailOptions = 
        from: `$APP_NAME <noreply@firebase.com>`,
        to: email,
      ;

      // The user unsubscribed to the newsletter.
      mailOptions.subject = `Bye!`;
      mailOptions.text = `Hey $displayName || ''!, We confirm that we have deleted your $APP_NAME account.`;
      await mailTransport.sendMail(mailOptions);
      console.log('Account deletion confirmation email sent to:', email);
      return null;
    

我参考此代码https://github.com/firebase/functions-samples/blob/master/quickstarts/email-users/functions/index.js

但是在我运行代码后我得到了错误

    Error: Invalid login: 534-5.7.9 Application-specific password required. Learn more at
534 5.7.9  https://support.google.com/mail/?p=InvalidSecondFactor i82sm13686303ilf.32 - gsmtp
    at SMTPConnection._formatError (/srv/node_modules/nodemailer/lib/smtp-connection/index.js:784:19)
    at SMTPConnection._actionAUTHComplete (/srv/node_modules/nodemailer/lib/smtp-connection/index.js:1523:34)
    at SMTPConnection._responseActions.push.str (/srv/node_modules/nodemailer/lib/smtp-connection/index.js:550:26)
    at SMTPConnection._processResponse (/srv/node_modules/nodemailer/lib/smtp-connection/index.js:942:20)
    at SMTPConnection._onData (/srv/node_modules/nodemailer/lib/smtp-connection/index.js:749:14)
    at TLSSocket.SMTPConnection._onSocketData.chunk (/srv/node_modules/nodemailer/lib/smtp-connection/index.js:195:44)
    at emitOne (events.js:116:13)
    at TLSSocket.emit (events.js:211:7)
    at addChunk (_stream_readable.js:263:12)
    at readableAddChunk (_stream_readable.js:250:11)

我还允许来自您的 Google 帐户的安全性较低的应用 还做了两步验证 但还是报错

我在 *** 中阅读了所有“类似问题”,但我不知道我是否需要其他任何东西,或者我是否做错了什么

【问题讨论】:

您是否按照 #8 here 的说明“设置 gmail.email 和 gmail.password Google Cloud 环境变量以匹配用于发送电子邮件的 Gmail 帐户的电子邮件和密码”?另外,你读过这个page吗? 是的,我做到了@Renaud Tarnec 【参考方案1】:

如果您在 Google 帐户上启用了 2 因素身份验证,则无法使用常规密码以编程方式访问 Gmail。您需要生成一个应用专用密码并使用该密码代替您的实际密码。

步骤:

登录您的 Google 帐户 转到我的帐户 > 登录和安全 > 应用密码 (再次登录以确认是您) 向下滚动到选择应用程序(在密码和登录方法框中)并选择其他(自定义名称) 给这个应用程序密码一个名字,例如“节点邮件程序” 选择生成 复制生成的长密码并将其粘贴到您的 Node.js 脚本中,而不是您的实际 Gmail 密码。

【讨论】:

只是说它对我有用。由于我在我的 gmail 帐户中启用了“2 因素身份验证”,因此我必须在我的帐户配置中转到 App Passwords,并允许 Google 为我生成一个 16 个字符的密码。然后我在我的应用程序中使用了这个密码,一切正常......【参考方案2】:

您需要为此使用应用程序密码。为您的 Gmail 帐户启用两步验证时会出现此问题。您可以使用应用密码绕过它。这是生成应用密码的方法。

    选择 Gmail 右上角的个人资料图标,然后选择管理 Google 帐户。

    在左侧边栏中选择安全性。

    在登录 Google 部分下选择应用密码。然后,系统会要求您确认您的 Gmail 登录凭据。

    在选择应用下,选择邮件或其他(自定义名称),然后选择一个设备。

    选择生成。

    您的密码将出现在新窗口中。按照屏幕上的说明完成该过程,然后选择“完成”。

谷歌文档:https://support.google.com/mail/answer/185833?hl=en#zippy=%2Cwhy-you-may-need-an-app-password

【讨论】:

【参考方案3】:

从https://security.google.com/settings/security/apppasswords 生成密码并改用该密码。

【讨论】:

以上是关于错误:无效登录:需要应用程序专用密码的主要内容,如果未能解决你的问题,请参考以下文章

错误:无效登录:535-5.7.8 不接受用户名和密码

配置 Spring Web 安全登录后给我无效的用户名和密码错误

Oracle.ManagedDataAccess 和 ORA-01017:用户名/密码无效;登录被拒绝

我收到错误“ 错误:无效登录:535-5.7.8 用户名和密码不被接受。”当我尝试使用 Node JS 中的模块 nodemailer 发送邮件时

更改密码后 Parse 中的会话令牌无效

“网关错误:(TESTMODE)商户登录 ID 或密码无效或帐户处于非活动状态。在 Magento 中 PlaceOrder Authorised.net 期间”