Проверка электронной почты с обратной связью Strongloop — токен подтверждения возвращен

В настоящее время я разрабатываю API. Я использую Strongloop (Loopback).

Я пытаюсь реализовать проверку электронной почты, когда пользователь регистрируется. У меня есть «пользовательская» модель, которая расширяет встроенную «пользовательскую» модель.

Прямо сейчас, когда пользователь регистрируется (POST /users), отправляется электронное письмо со ссылкой на /users/confirm с тремя соответствующими параметрами, т. е. uid, перенаправление и токен. Когда пользователь нажимает на ссылку, адрес электронной почты последнего подтверждается правильно (поле emailVerification становится истинным).

Однако я заметил, что при выполнении запроса POST на /users ответ содержит токен проверки. Это нормально? Разве токен проверки не доступен только через отправленное электронное письмо?

Потому что, как есть, сделав POST-запрос на /users и получив токен подтверждения в ответ, можно легко отправить другой запрос пользователям/подтвердить с соответствующими параметрами (включая токен подтверждения) и проверить адрес электронной почты, даже если адрес не существует.

Я новичок в Strongloop и, возможно, я что-то упускаю. Вы можете помочь?


person user2483431    schedule 04.12.2014    source источник
comment
Я создаю пример репозитория для таких вопросов, поскольку он часто возникает. Вы можете увидеть, что у меня сейчас есть на github.com/strongloop/loopback-faq-user- управление. Это еще не сделано, так как я сейчас работаю над этим, но я надеюсь закончить к пятнице.   -  person superkhau    schedule 04.12.2014
comment
Звучит здорово. С нетерпением жду этого.   -  person user2483431    schedule 04.12.2014
comment
Пример выполнен, пожалуйста, проголосуйте за ответ.   -  person superkhau    schedule 10.12.2014


Ответы (3)


Я только что закончил пример. Видеть:

https://github.com/strongloop/loopback-faq-user-management

person superkhau    schedule 10.12.2014
comment
Вы предлагаете нам создать новую пользовательскую модель в приложении? Почему нельзя использовать модель пользователя вместо модели пользователя? - person Anoop.P.A; 11.08.2015
comment
Да, мы рекомендуем вам расширить встроенную пользовательскую модель, чтобы упростить настройку. Обратите внимание, что у вас нет User.json или User.js в common/models, так что гораздо проще расширить встроенный с помощью user, тогда вы можете изменить common/models/user.js и common/models/user.json, как и в любой другой модели с каркасом. - person superkhau; 11.08.2015

если вы хотите создать ссылку для проверки регистрации пользователя, но не использовать встроенный модер пользователя, вам нужно создать токен проверки, а затем отправить ссылку. Я добавил два метода. вам также нужно использовать удаленный метод с одним аргументом, который является объектом тип: вам нужно отправить параметр с регистрационным адресом электронной почты. метод подобен этому .... здесь мы используем имя пользователя = любое имя переменной, modelN = имя модели

modelN.sendVerificationEmail = function (data, callback) {
  var user = loopback.models.modelN;

  if (!data.email) {
    return callback(commonUtils.buildError(
      'Recipient email is required.', 400, 'EMAIL_REQUIRED'
    ));
  }

  if (!emailValidator.validate(data.email)) {
    return callback(commonUtils.buildError(
      'Must provide a valid email.', 400, 'INVALID_EMAIL'
    ));
  }

  var findOneuserPromise
    = modelN.findOne({ 'where': { 'email': data.email }});

  findOneBusinessEmployeePromise.then(function (user) {
    if (!user) {
      return callback();
    }

    var sendVerificationEmailPromise
      = anothermodelname.sendVerificationEmail(user.id);

    sendVerificationEmailPromise.then(function () {
      callback();
    });

    sendVerificationEmailPromise.then(null, function (error) {
      callback(error);
    });
  });

  findOneuserPromise.then(null, function (error) {
    callback(error);
  });
};

я добавил еще один метод модели модели после того, как добавить это,....

anothermodelname.sendVerificationEmail = function (userid) {
  var modelN = loopback.models.modelN;
  var Email = loopback.models.Email;
  var deferred = Q.defer();
  var findByIduserPromise = modelN.findById(userId);

  findByIduserPromise.then(function (user) {
    if (!user) {
      return deferred.reject(commonUtils.buildError(
        'Unknown "modelN" id "' + userId + '".',
        404, 'MODEL_NOT_FOUND'
      ));
    }
    if (!user.verificationToken) {
      return deferred.resolve(true);
    }


    modelN.generateVerificationToken(user,
      function (verificationTokenError, verificationToken) {
        if (verificationTokenError) {
          return deferred.reject(verificationTokenError);
        }

        user.verificationToken = verificationToken;

        var saveuserPromise = user.save();

        saveuserPromise.then(function (updateduser) {
          var link = emailConf.clientBaseUrl +
            emailConf.verifyEmailRedirect + '?uid=' +
            updateduser.id + '&token=' +
            updateduser.verificationToken;
               console.log("check+link:",link);
          /*eslint camelcase: [0, {properties: "never"}]*/
          emailOptions.to = updateduser.email;
          emailOptions.template = { 'name': 'verify' };
          emailOptions.global_merge_vars = [];

          emailOptions.global_merge_vars.push({
            'name': 'USER_NAME',
            'content': updateduser.name
            || updateduser.username || updateduser.email
          });

          emailOptions.global_merge_vars.push({
            'name': 'LINK',
            'content': link
          });
          Email.send(emailOptions, function () {});

          deferred.resolve(true);
        });

        saveuserPromise.then(null, function (error) {
          deferred.reject(error);
        });
      });
  });

  findByIduserPromise.then(null, function (error) {
    deferred.reject(error);
  });

  return deferred.promise;
};
person coder    schedule 30.06.2016
comment
если у кого-то есть какие-либо проблемы, то спросите меня - person coder; 30.06.2016

@ user2483431, подтвердите, что электронная почта предоставляет токен подтверждения электронной почты в ответ вместе с идентификатором пользователя. Как вы правильно заметили, это рискует обмануть систему. Одним из решений является удаление значения токена из ответа.

Внутри afterRemote для создания пользователя вы можете использовать

user.verify(options, function(err, response, next2) {
  if (err) {
    // error handling code
  }
  // stripping off verificationToken from response for security
  var replacementText = "check email"
  context.result.verificationToken = replacementText;
  next();
});

Надеюсь это поможет!

person princecharmx    schedule 09.02.2016