From 4915ad3233d99130489564fc0b0d759a60c8ad23 Mon Sep 17 00:00:00 2001 From: Ben Ramey Date: Tue, 10 Jun 2014 19:19:00 -0500 Subject: [PATCH] Progress in implementing passport --- api/controllers/UserController.js | 30 +++++++++++++++++++++ api/models/User.js | 45 +++++++++++++++++++++++++++++++ config/passport.js | 43 +++++++++++++++++++++++++++++ package.json | 4 ++- 4 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 api/controllers/UserController.js create mode 100644 api/models/User.js diff --git a/api/controllers/UserController.js b/api/controllers/UserController.js new file mode 100644 index 0000000..9ffcd41 --- /dev/null +++ b/api/controllers/UserController.js @@ -0,0 +1,30 @@ +/** + * UserController + * + * @module :: Controller + * @description :: A set of functions called `actions`. + * + * Actions contain code telling Sails how to respond to a certain type of request. + * (i.e. do stuff, then send some JSON, show an HTML page, or redirect to another URL) + * + * You can configure the blueprint URLs which trigger these actions (`config/controllers.js`) + * and/or override them with custom routes (`config/routes.js`) + * + * NOTE: The code you write here supports both HTTP and Socket.io automatically. + * + * @docs :: http://sailsjs.org/#!documentation/controllers + */ + +module.exports = { + + + + + /** + * Overrides for the settings in `config/controllers.js` + * (specific to UserController) + */ + _config: {} + + +}; diff --git a/api/models/User.js b/api/models/User.js new file mode 100644 index 0000000..99df1c4 --- /dev/null +++ b/api/models/User.js @@ -0,0 +1,45 @@ +/** + * User + * + * @module :: Model + * @description :: A short summary of how this model works and what it represents. + * @docs :: http://sailsjs.org/#!documentation/models + */ + +var bcrypt = require('bcrypt'); + +module.exports = { + + attributes: { + username: { + type: 'string', + required: true, + unique: true + }, + password: { + type: 'string', + required: true + }, + toJSON: function() { + var obj = this.toObject(); + delete obj.password; + return obj; + } + }, + + beforeCreate: function(user, cb) { + bcrypt.genSalt(10, function(err, salt) { + bcrypt.hash(user.password, salt, function(err, hash) { + if (err) { + console.log(err); + cb(err); + } + else { + user.password = hash; + cb(null, user); + } + } + } + } + +}; diff --git a/config/passport.js b/config/passport.js index e69de29..fc65530 100644 --- a/config/passport.js +++ b/config/passport.js @@ -0,0 +1,43 @@ +var passport = require('passport'), + LocalStrategy = require('passport-local').Strategy, + bcrypt = require('bcrypt'); + +passport.serializeUser(function(user, done) { + done(null, user[0].id); +}); + +passport.deserializeUser(function(id, done) { + User.findById(id, function(err, user) { + done(err, user); + }); +}); + +passport.use(new LocalStrategy( + function(username, password, done) { + User.findByUsername(username).done(function(err, user) { + if (err) { + return done(null, err); + } + if (!user || user.length < 1) { + return done(null, false, { + message: 'Incorrect User' + }); + } + bcrypt.compare(password, user[0].password, function(err, res) { + if (!res) return done(null, false, { + message: 'Invalid Password' + }); + return done(null, user); + }); + }); + })); + +module.exports = { + express: { + customMiddleware: function(app) { + console.log('express midleware for passport'); + app.use(passport.initialize()); + app.use(passport.session()); + } + } +}; diff --git a/package.json b/package.json index 960d5b9..edccbf4 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,9 @@ "grunt-contrib-coffee": "~0.10.1", "grunt-sails-linker": "~0.9.5", "grunt-contrib-jade": "~0.10.0", - "passport": "0.2.0" + "passport": "0.2.0", + "passport-local": "1.0.0", + "bcrypt": "0.7.8" }, "scripts": { "start": "node app.js",