Строим блог на основе Node.js MVC фреймворка Areto

Форма входа

Форма входа принимает логин/пароль и ищет в базе соответствующую запись пользователя.

Форма входа пользователя

models/SignInForm.js

'use strict';
const Base = require('areto/base/Model');
module.exports = class SignInForm extends Base {
    // place methods here
};
module.exports.init(module);
const User = require('./User');

Валидация формы необходима, чтобы фильтровать некорректные значения ввода.

models/SignInForm.js

...
static getConstants () {
  return {
    RULES: [
      [['email', 'password'], 'required'],
      ['email', 'email'],
      ['rememberMe', 'boolean'],
      ['password', 'string', {min: 6, max:24}]
     ]
  };
}
...

Метод login проверяет данные формы. Если ошибок нет, то передает управление checkUser для поиска пользователя в базе.

models/SignInForm.js

...
login (webuser, cb) {
  this.validate(err => {
    err || this.hasError() ? cb(err) : this.checkUser(webuser, cb)
  });
}
...

В методе checkUser пользователь ищется по уникальному логину, в роли которого выступает email. Если пользователь с данным email существует, то будет создан экземпляр класса User. Дальнейшие проверки пользователя осуществляют методы этого класса.

Обратите внимание на одинаковый ответ сервера в случае не найденного логина и неправильного пароля. Этим закрывается возможность для посторонних узнать существует ли данный логин в базе.

Помимо пароля проверяется статус учетной записи. Если пользователь заблокирован, то сервер вернет соответствующее сообщение об ошибке входа.

После успешных проверок в методе webuser.login осуществляется привязка текущей пользовательской сессии к найденному пользователю. Если на форме был отмечен чекбокс rememberMe, то в куки броузера будет добавлена информация для автоматического входа пользователя на указанный период.

models/SignInForm.js

...
checkUser (webuser, cb) {
  User.find({email: this.get('email')}).one((err, model)=> {
    if (model) {
      if (model.validatePassword(this.get('password'))) {
        if (model.isBanned()) {
          this.addError('email', 'This account banned');
        }
      } else {
        this.addError('password', 'Invalid authentication');
      }
    } else {
      this.addError('password', 'Invalid authentication');
    }
    this.hasError()
      ? cb()
      : webuser.login(model, this.get('rememberMe') ? 3600 * 24 * 7 : 0, cb);
  });
}
...