【问题标题】:invalid grant pops up while sending Gmail in nodemailer在 nodemailer 中发送 Gmail 时弹出无效授权
【发布时间】:2021-10-29 18:59:57
【问题描述】:

当我发送邮件时,它成功发送邮件。但几天后,它说'invalid_grant'。然后当我再次从https://developers.google.com/oauthplayground 生成一个新的刷新令牌并使用它时,它又可以工作了。那么访问令牌几天后不起作用是什么问题。

const GOOGLE_CLIENT_ID = process.env.GOOGLE_CLIENT_ID
const GOOGLE_CLIENT_SECRET = process.env.GOOGLE_CLIENT_SECRET
const GOOGLE_REDIRECT_URI = process.env.GOOGLE_REDIRECT_URI
const GOOGLE_REFRESH_TOKEN = process.env.GOOGLE_REFRESH_TOKEN

const oAuth2Client = new google.auth.OAuth2(GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_REDIRECT_URI)
oAuth2Client.setCredentials({refresh_token: GOOGLE_REFRESH_TOKEN})

export async function sendMail(payload: IMailDTO): Promise<SMTPTransport.SentMessageInfo>{
    const data = MailDTO.receiver(payload)
    const accessToken = await oAuth2Client.getAccessToken()

    const transport = nodemailer.createTransport({
        // @ts-ignore
        service: 'gmail',
        auth: {
            type: 'OAUTH2',
            user: 'user@gmail.com',
            clientId: GOOGLE_CLIENT_ID,
            clientSecret: GOOGLE_CLIENT_SECRET,
            refreshToken: GOOGLE_REFRESH_TOKEN,
            accessToken,
        }
    })
    
    const mailOptions = {
        from: 'no-reply <no-reply@gmail.com>',
        to: data.to,
        subject: data.subject,
        text: data.text,
        html: data.html
    }

    let result = await transport.sendMail(mailOptions)
    
    if(!result){
        throw new Error("Email not sent. Try again.")
    }

    return result
}

【问题讨论】:

    标签: javascript node.js mongodb oauth gmail


    【解决方案1】:

    问题不在于您的访问令牌,而在于您的刷新令牌。

    首先是 OAuth Playground 会在 24 小时后自动撤销刷新令牌。您可以通过使用配置面板指定您自己的应用程序 OAuth 凭据来避免这种情况。

    第二个是,如果您提供了自己的 OAuth 凭据并且您的应用程序仍在测试中,那么它将在 7 天后过期。

    为外部用户类型配置了 OAuth 同意屏幕且发布状态为“正在测试”的 Google Cloud Platform 项目发出了一个在 7 天后到期的刷新令牌。

    要拥有一个不会过期的刷新令牌,您需要使用自己的凭据创建它,并确保将您的应用程序设置为生产环境。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      • 2017-03-27
      • 2021-07-17
      • 1970-01-01
      • 2021-06-15
      • 1970-01-01
      相关资源
      最近更新 更多