当前位置: 首页 > 知识库问答 >
问题:

此发送重置密码电子邮件的实现是否正确?

仰雅昶
2023-03-14

我看过这篇文章了https://ahrjarrett.com/posts/2019-02-08-resetting-user-passwords-with-node-and-jwt了解如何在express中重置密码。

mailer.js


const nodemailer = require("nodemailer")

export const transporter = nodemailer.createTransport({
    service: "gmail",
    auth: {
        user: process.env.EMAIL,
        pass: process.env.PASSWORD
    }
})

export const getPasswordResetURL = (user, token) => {
    `http://localhost:3000/password/reset/${user._id}/${token}`
}

export const resetPasswordTemplate = (user, url) => {
    const from = process.env.EMAIL
    const to = user.email
    const subject = "Password Reset"
    const html = `
        <p>Hey ${user.name || user.email},</p>
        <p>We heard that you forgot your password. Sorry about that!</p>
        <p>But don’t worry! You can use the following link to reset your password:</p>
        <a href=${url}>${url}</a>
        <p>If you don’t use this link within 1 hour, it will expire.</p>
    `
}

return { from, to, subject, html }
emailController.js


const jwt = require("jsonwebtoken")
const bcrypt = require("bcrypt")
const User = require("../models/User")
import { transporter, getPasswordResetURL, resetPasswordTemplate } from "../utils/mailer"

export const usePasswordHashToMakeToken = ({
    password: passwordHash,
    _id: userId,
    createdAt
  }) => {
    const secret = passwordHash + "-" + createdAt
    const token = jwt.sign({ userId }, secret, {
      expiresIn: 3600 // 1 hour
    })
    return token
  }

  export const sendPasswordResetEmail = async (req, res) => {
    const { email } = req.params
    let user
    try {
      user = await User.findOne({ email }).exec()
    } catch (err) {
      res.status(404).json("No user with that email")
    }
    const token = usePasswordHashToMakeToken(user)
    const url = getPasswordResetURL(user, token)
    const emailTemplate = resetPasswordTemplate(user, url)

    const sendEmail = () => {
      transporter.sendMail(emailTemplate, (err, info) => {
        if (err) {
          res.status(500).json("Error sending email")
        }
        console.log(`** Email sent **`, info.response)
      })
    }
    sendEmail()
  }

  export const receiveNewPassword = (req, res) => {
    const { userId, token } = req.params
    const { password } = req.body

    User.findOne({ _id: userId })

      .then(user => {
        const secret = user.password + "-" + user.createdAt
        const payload = jwt.decode(token, secret)
        if (payload.userId === user.id) {
          bcrypt.genSalt(10, function(err, salt) {
            if (err) return
            bcrypt.hash(password, salt, function(err, hash) {
              if (err) return
              User.findOneAndUpdate({ _id: userId }, { password: hash })
                .then(() => res.status(202).json("Password changed accepted"))
                .catch(err => res.status(500).json(err))
            })
          })
        }
      })

      .catch(() => {
        res.status(404).json("Invalid user")
      })
  }

users.js

const express = require('express');
const router = express.Router();
const userController = require("../controllers/userController")
const emailController = require("../controllers/emailController")

router.post("/register", userController.registerUser)
router.post("/login", userController.loginUser)
router.get("/:userId", userController.getUser)
router.post("/user/:email", emailController.sendPasswordResetEmail)
router.post("/receive_new_password/:userId/:token", emailController.receiveNewPassword)


module.exports = router;

这给了我一个意外标记{的错误

从".../utils/mailer"导入{transaver, getPasswordResetURL, resetPasswordTemboard}

我可以将此导出const转换为module.exports并要求上述:

const{transporter,getPasswordResetURL,resetPasswordTemplate}=require(“../utils/mailer”)

共有1个答案

解晟睿
2023-03-14

正如您在问题中提到的,替换所有导出const并将其替换为

module.exports = {transporter, getPasswordResetURL, resetPasswordTemplate}

同时更换管路

import { transporter, getPasswordResetURL, resetPasswordTemplate } from "../utils/mailer"

const { transporter, getPasswordResetURL, resetPasswordTemplate } = require("../utils/mailer")

作为导入,导出是es6语法和要求,module.exports是es5语法。如果要使用导入,则需要配置Babel。

建议

最有可能的例子是,他同时使用es6和es5语法(他一定配置了babel)。但在你的情况下,我认为你没有配置巴贝尔。因此,我建议您要么配置babel,要么将所有es6语法更改为es5。在es6中可以使用es5,但在es5中不能使用es6

 类似资料:
  • 问题内容: 在我的应用程序中,我使用的是Django Allauth。我没有任何用户注册表格。管理员将通过上传包含用户信息的Excel文件来注册用户。我已完成所有这些操作,并且通过自动生成密码将用户保存在用户表中。上传用户列表并将其保存在数据库中之后,我想向每个用户发送重置密码电子邮件。 在allauth重置密码中,您首先需要进入重置页面并输入您的电子邮件。然后会发送一封电子邮件,指示您更改密码

  • 问题内容: 我知道有一些与此类似的问题,但我无法使其正常运行。 好的,我在一个名为$ emailList的变量中有一个从数据库中获取的电子邮件列表。如果将变量放在该部分中,则可以获取代码以从表单发送电子邮件,但无法使其与bcc一起使用。我什至还添加了一封电子邮件,以防万一,但这没什么关系。 这是我的代码。 我试过两个代码: 和 不是因为这些电子邮件而没有分开电子邮件。我知道他们是因为如果我在本节中

  • 问题内容: MyDjango应用程序当前已设置为使用本机注册包来处理用户身份验证和管理。 我创建了一些文件,用于发送密码重置令牌. 它工作正常。除了密码重设电子邮件外,它是一个丑陋的纯文字怪物。我想使其与My应用程序发送的所有其他电子邮件的外观和风格相匹配。IE:我希望它是HTML,并包含图像,样式和链接。我怎么做? 我按照这里的详细说明进行操作。但是,该代码中有一个错误,我不知道该如何处理: 有

  • 这是我通过zohomail发送电子邮件的bean配置 当我运行我的程序我得到以下错误 组织。springframework。邮政MailSendException:消息失败后无法关闭服务器连接;嵌套的异常是javax。邮政MessaginException:无法向SMTP主机发送命令;嵌套的例外是:java。网SocketException:远程主机关闭的连接。失败消息:com。太阳邮政smtp。

  • 问题内容: 我正在使用sendgrid发送电子邮件,并且使用以下代码可以正常工作,但没有附件。 但是我需要发送附件,因此我搜索了github源和Web文档API,由于某种原因,没有javadocs,但是有一个示例GitHub sendgrid, 所以我一直在尝试直到它起作用为止,我缩小了一些异常和响应代码,起初我是被禁止的未经授权,最好是响应202,表示有效且已排队(在此处检查),这是我的代码发送

  • 问题内容: 在Swift 的正常情况下,我使用此代码发送邮件。 如何在SwiftUI中实现相同目标? 我需要使用吗? 问题答案: 如前所述,您需要将组件移植到via 。 这是一个简单的实现: 用法 : (在运行iOS 13的iPhone 7 Plus上进行了测试-就像一个护身符) 为Xcode 11.4更新