Что нужно сделать для исправления этой функции сброса пароля в этом угловом коде с Node.js и Nodemailer - PullRequest
0 голосов
/ 24 января 2019

Мы пытаемся создать функцию сброса пароля в Angular 6 с Node.js. Дело в том, что когда вы нажимаете пароль для сброса и заполняете свое письмо, оно отправляет письмо со ссылкой для сброса пароля. Но ссылка внутри письма не связывается с Angular. Мы используем Node.js и Node mailer в бэкэнде. Вот код:

Node.js

 async ResetPassword(req, res) {
    if (!req.body.email) {
      return res
        .status(HttpStatus.INTERNAL_SERVER_ERROR)
        .json({ message: 'Email is required' });
    }

    const userEmail = await User.findOne({
      email: Helpers.lowerCase(req.body.email)
    });
    if (!userEmail) {
      return res
        .status(HttpStatus.CONFLICT)
        .json({ message: 'Email does not exist' });
    }

      const body = {
        email: Helpers.lowerCase(value.email),

      };
            var resettoken = new resetToken({ _userId: user._id, resettoken: crypto.randomBytes(16).toString('hex') });
            resettoken.save(function (err) {
                if (err) { return res.status(500).send({ msg: err.message }); }
                var transporter = nodemailer.createTransport({
                    service: '"SendGrid"',
                    auth:
                     {
                      user: 'login',
                      pass: 'password'
                     }
                });
                var mailOptions = {
                    from: 'email',
                    subject: 'Node.js Password Reset',
                    text: 'You are receiving this because you (or someone else) have requested the reset of the password for your account.\n\n' +
                      'Please click on the following link, or paste this into your browser to complete the process:\n\n' +
                      'http://' + req.headers.host + '/new-password/' + resettoken + '\n\n' +
                      'If you did not request this, please ignore this email and your password will remain unchanged.\n'
                }

                transporter.sendMail(mailOptions 
                )          
            })

        .catch(err => {
            res
                .status(HttpStatus.INTERNAL_SERVER_ERROR)
                .json({ message: 'Error occured' });
        });
    },

Ссылка внутри почтового шаблона не работает.

Маршрут

router.post('/new-password', AuthCtrl.NewPassword);

Угловая

      route.queryParams.subscribe(params => {
        this.form.resetToken = params['token'];
      });
    }


  ngOnInit() {
    this.Init();
  }

  Init() {
    this.ResponseResetForm = this.fb.group(
      {
        email: ['', Validators.required, Validators.email],
        newPassword: ['', Validators.required],
        confirmPassword: ['', Validators.required]
      },
      {
        validator: this.Validate.bind(this)
      }
    );
  }

 ...
...

  ResetPassword() {

    this.authService.newPassword(this.ResponseResetForm.value).subscribe(
      data => {
        this.ResponseResetForm.reset();
        setTimeout(() => {
          this.router.navigate(['sign-in']);
        }, 3000);
      },
      err => {

        if (err.error.message) {
          this.errorMessage = err.error.message;
        }
      }
    );
  }
}

Эта часть я добавил из другого кода:

 route.queryParams.subscribe(params => {
            this.form.resetToken = params['token'];
          });
        }

Но я не думаю, что это подходит для нашего кода. Также вот маршрут для этого компонента в Angular:

  {
    path: 'response-reset-password',
    component: ResponseResetComponent
  },

Как мы можем заставить этот бэкэнд-контроллер работать, как ожидается, с Angular front-end?

1 Ответ

0 голосов
/ 25 января 2019

Поэтому, когда вы встраиваете ссылку в свое электронное письмо, эта ссылка должна перенаправляться на внешний интерфейс Angular, а не на внутренний:

{
   path: 'new-password', // I would suggest changing this path to match your Component. This will also lead to changing the URL being embedded in the ResetPassword email
   component: ResponseResetComponent
}

Теперь, когда пользователь щелкает ссылку в электронном письме, внешний интерфейс будетзагружаться, то вы можете обработать token в ResponseResetComponent, чтобы фактически отправить запрос на: router.post('/new-password') на серверной части.

...