summaryrefslogtreecommitdiff
path: root/models/User.js
diff options
context:
space:
mode:
Diffstat (limited to 'models/User.js')
-rwxr-xr-xmodels/User.js43
1 files changed, 43 insertions, 0 deletions
diff --git a/models/User.js b/models/User.js
new file mode 100755
index 0000000..9391c35
--- /dev/null
+++ b/models/User.js
@@ -0,0 +1,43 @@
+const mongoose = require('mongoose');
+const crypto = require('crypto');
+const jwt = require('jsonwebtoken');
+
+const { Schema } = mongoose;
+
+const UserSchema = new Schema({
+ email: String,
+ hash: String,
+ salt: String,
+});
+
+UserSchema.methods.setPassword = function(password) {
+ this.salt = crypto.randomBytes(16).toString('hex');
+ this.hash = crypto.pbkdf2Sync(password, this.salt, 10000, 512, 'sha512').toString('hex');
+};
+
+UserSchema.methods.validatePassword = function(password) {
+ const hash = crypto.pbkdf2Sync(password, this.salt, 10000, 512, 'sha512').toString('hex');
+ return this.hash === hash;
+};
+
+UserSchema.methods.generateJWT = function() {
+ const today = new Date();
+ const expirationDate = new Date(today);
+ expirationDate.setDate(today.getDate() + 60);
+
+ return jwt.sign({
+ email: this.email,
+ id: this._id,
+ exp: parseInt(expirationDate.getTime() / 1000, 10),
+ }, 'secret');
+}
+
+UserSchema.methods.toAuthJSON = function() {
+ return {
+ _id: this._id,
+ email: this.email,
+ token: this.generateJWT(),
+ };
+};
+
+mongoose.model('User', UserSchema); \ No newline at end of file