При сбросе пароля, как мне избежать ошибки 400 от Feathersjs?

Попытка подтверждения по электронной почте с использованием управления-аутентификацией-перьями. Я следовал руководству Имре Геленса, основанному на более раннем руководстве Джона Пола Майлза.

Подтверждение регистрации и сброс пароля полностью работают в разработке, но Verify не работает в производственной среде. В браузере получаю:

POST https://www.example.com/authManagement 400 (Bad Request)

Verify полностью работает в производственной среде.

Возможно, проблема связана с моей конфигурацией прокси-сервера nginx, но тогда почему Verify работает?

Любое понимание приветствуется.

Учебники находятся по адресу: https://hackernoon.com/setting-up-email-verification-in-feathersjs-ce764907e4f2 и https://blog.feathersjs.com/how-to-setup-email-verification-in-feathersjs-72ce9882e744

Вот authmanagement.service.js

// Initializes the `authmanagement` service on path `/authmanagement`
const authManagement = require('feathers-authentication-management');
const hooks = require('./authmanagement.hooks');
const notifier = require('./notifier');

module.exports = function (app) {

  // Initialize our service with any options it requires
  app.configure(authManagement(notifier(app)));

  // Get our initialized service so that we can register hooks and filters
  const service = app.service('authManagement');

  service.hooks(hooks);
};

Ни один из хуков не установлен в authmanagement.hooks

Тогда notifier.js:

module.exports = function(app) {

function getLink(type, hash) {
  // I don't think we get this far without hitting the error
  // in dev:
    // const url = 'http://xx.xxx.xxx.xxx:nnnn/' + type + '?token=' + hash
  // in prod:
  // env var:  SERVER_CALL="https://www.example.com/"
  const url = process.env.SERVER_CALL + type + '?token=' + hash
  return url
}

function sendEmail(email) {
  return app.service('mailer').create(email).then(function (result) {
    console.log('Sent email', result)
  }).catch(err => {
    console.log('Error sending email', err)
  })
}

return {
  notifier: function(type, user, notifierOptions) {
    let tokenLink
    let email
    switch (type) {
      case 'resendVerifySignup': //sending the user the verification email
        tokenLink = getLink('verify', user.verifyToken)
        email = {
           from: process.env.FROM_EMAIL,
           to: user.email,
           subject: 'Verify Signup',
           html: "<p>You are receiving this email from a registration request on example.com. \
                If you did not make that request, you can safely ignore this message.</p> \
                <p>To complete your registration, follow this link:</p>" + tokenLink + "&email=" + user.email
        }
        return sendEmail(email)
        break

      case 'verifySignup': // confirming verification
        tokenLink = getLink('verify', user.verifyToken)
        email = {
           from: process.env.FROM_EMAIL,
           to: user.email,
           subject: 'Confirm Signup',
           html: 'Thanks for verifying your email'
        }
        return sendEmail(email)
        break

      case 'sendResetPwd':
        tokenLink = getLink('reset', user.resetToken)
        email = {
           from: process.env.FROM_EMAIL,
           to: user.email,
           subject: 'Reset Password',
           html: "<p>You are receiving this email because someone made a request to reset your password. \
                If you did not make that request, you can safely ignore this message.</p> \
                <p>Alternatively, if you do want to reset you password, follow this link:</p>" + tokenLink + "&email=" + user.email
        }
        return sendEmail(email)
        break

      case 'resetPwd':
        tokenLink = getLink('reset', user.resetToken)
        email = {
           from: process.env.FROM_EMAIL,
           to: user.email,
           subject: 'Confirm Reset',
           html: 'Thanks for resetting'
        }
        return sendEmail(email)
        break

      case 'passwordChange':
        email = {}
        return sendEmail(email)
        break

      case 'identityChange':
        tokenLink = getLink('verifyChanges', user.verifyToken)
        email = {}
        return sendEmail(email)
        break

      default:
        break
    }
  }
}
}

И соответствующий бит конфигурации nginx:

location /authManagement {
        proxy_pass http://nnn.nn.nnn.nnn:pppp;
}

Звонок от клиента:

    var call = "";
    if (process.env.NODE_ENV === "development"){
      call = "http://xx.xxx.xxx.xxx:pppp/authManagement";
    }
    else if (process.env.NODE_ENV === "production"){
      call = "https://www.example.com/authManagement";
    }

    axios.post(call, {
      action: 'sendResetPwd',
      value: { email: emailValue }
     })

person user2093191    schedule 19.03.2020    source источник


Ответы (1)


Отказ от этого. Feathers отлично смотрится на поверхности - особенно если услуги создаются автоматически в прочном поместье. Но попытка отладить подобные проблемы упрощает создание api вручную. Большой интерес вызывает создание инфраструктуры подтверждения электронной почты и сброса пароля, но на самом деле это не так. И, кажется, проще сделать это с нуля.

В качестве продолжения: после того, как я отказался от Feathers, я завершил аутентификацию по электронной почте за 1 день. Я потратил месяц, пытаясь заставить Feathers работать. Изначально я рассчитывал, что на выполнение работы потребуется 3 дня. Моисей Эсан сделал действительно хорошее руководство - он работал через час или два, остаток дня провел, перемещая электронную почту из Sendgrid в AWS SES и несколько других модов. Легко отлаживать и изменять. Все сделано! Разумеется, весь клиентский код был повторно использован с небольшими изменениями.
Вот его руководство, на случай, если оно кому-то поможет

person user2093191    schedule 26.03.2020
comment
Мне очень нравятся перья, но мы закончили тем, что вырвали и перья auth management. - person Joe; 02.04.2020
comment
столкнулся с той же проблемой. не могли бы вы поделиться исходным кодом? - person CCCC; 12.04.2021