/
eb
/
nodejs-screencast
Обзор
Документация
Войти
/
eb
/
nodejs-screencast
Код
Запросы
0
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
chat/13/models/user.js
84 строки
2 KB
Ilya Kantor
added part 13
07 дек 2013, 14:38
07 дек 2013, 14:38
565f01b
Код
Авторство
О чём код?
var crypto = require('crypto'); var async = require('async'); var util = require('util'); var mongoose = require('lib/mongoose'), Schema = mongoose.Schema; var schema = new Schema({ username: { type: String, unique: true, required: true }, hashedPassword: { type: String, required: true }, salt: { type: String, required: true }, created: { type: Date, default: Date.now } }); schema.methods.encryptPassword = function(password) { return crypto.createHmac('sha1', this.salt).update(password).digest('hex'); }; schema.virtual('password') .set(function(password) { this._plainPassword = password; this.salt = Math.random() + ''; this.hashedPassword = this.encryptPassword(password); }) .get(function() { return this._plainPassword; }); schema.methods.checkPassword = function(password) { return this.encryptPassword(password) === this.hashedPassword; }; schema.statics.authorize = function(username, password, callback) { var User = this; async.waterfall([ function(callback) { User.findOne({username: username}, callback); }, function(user, callback) { if (user) { if (user.checkPassword(password)) { callback(null, user); } else { callback(new AuthError("Пароль неверен")); } } else { var user = new User({username: username, password: password}); user.save(function(err) { if (err) return callback(err); callback(null, user); }); } } ], callback); }; exports.User = mongoose.model('User', schema); function AuthError(message) { Error.apply(this, arguments); Error.captureStackTrace(this, AuthError); this.message = message; } util.inherits(AuthError, Error); AuthError.prototype.name = 'AuthError'; exports.AuthError = AuthError;