Skip to content

Commit

Permalink
getting auth and user population in session working
Browse files Browse the repository at this point in the history
  • Loading branch information
Warner Onstine committed Jan 9, 2015
1 parent de712b2 commit a8ec1ce
Show file tree
Hide file tree
Showing 16 changed files with 289 additions and 48 deletions.
8 changes: 5 additions & 3 deletions app.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
var cluster = require('cluster'),
numCPUs = Math.min(2,require('os').cpus().length);

if (cluster.isMaster && process.env.NODE_ENV != "testing") {
if (cluster.isMaster && process.env.NODE_ENV != "test") {
// Fork workers
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
Expand Down Expand Up @@ -54,7 +54,9 @@ var
var
mongoose = require("mongoose");

ServerConf = require("./config")(server);

console.log("env port %s, conf port %s",process.env.PORT, conf.get('port'));
server.listen(conf.get('port'), function(){
console.log("Restify listening on port " + conf.get('port'));
});
Expand All @@ -78,6 +80,6 @@ process.on('uncaughtException', function (err) {
}, 30000);

killtimer.unref();
if(process.env.NODE_ENV != "testing") cluster.worker.disconnect();
if(process.env.NODE_ENV == "testing") process.exit(1);
if(process.env.NODE_ENV != "test") cluster.worker.disconnect();
if(process.env.NODE_ENV == "test") process.exit(1);
});
1 change: 0 additions & 1 deletion config/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ var Config = function(server) {
var server_config = require("./server")(server);
var routes = require("./routes")(server);

return require("./settings");
};

module.exports = Config;
12 changes: 6 additions & 6 deletions config/redis.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
var Redis = function(){
var
Settings = require("./settings"),
conf = require("./settings"),
redis = require("redis"),
rclient = redis.createClient(
Settings.redis.options.port,
Settings.redis.options.host,
Settings.redis.options
conf.get('redis.options.port'),
conf.get('redis.options.host'),
conf.get('redis.options')
);

redis.debug_mode = Settings.redis.debug;
redis.debug_mode = conf.get('redis.debug');

if(Settings.redis.options.pass) rclient.auth(Settings.redis.options.pass);
if(conf.get('redis.options.pass')) rclient.auth(conf.get('redis.options.pass'));

return rclient;
}();
Expand Down
1 change: 0 additions & 1 deletion config/routes.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
var Routes = function(server) {

var
Settings = require("./settings"),
auth = require("../controllers/auth"),
users = require("../controllers/users");

Expand Down
4 changes: 2 additions & 2 deletions config/server.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
var ServerConfig = function(server) {

var
Settings = require("./settings"),
conf = require("./settings"),
restify = require("restify"),
restifyOAuth2 = require("restify-oauth2"),
auth = require("../controllers/auth"),
Expand All @@ -22,7 +22,7 @@ var ServerConfig = function(server) {
restifyOAuth2.ropc(server, {
tokenEndpoint: "/token",
hooks: auth.oauthHooks,
tokenExpirationTime: Settings.auth.token.maxAge
tokenExpirationTime: conf.get('auth.token.maxAge')
});

/* Start CORS: All of this is required to get this working. */
Expand Down
8 changes: 7 additions & 1 deletion config/settings.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,11 @@ var conf = convict({
},
redis: {
url: "redis://localhost:6379",
options: {},
options: {
host: "",
port: "",
pass: ""
},
debug: false,
prefix: "todo:",
env: "REDISTOGO_URL"
Expand All @@ -43,11 +47,13 @@ var conf = convict({


var env = conf.get('env');
console.log("port before loading env specifics %s, env port %s", conf.get('port'),process.env.PORT);
conf.loadFile (__dirname + '/'+ env + '_config.json');

conf.validate();

var saveRedisDetails = function () {
console.log("calling redis details");
var redis_url = require("url").parse(conf.get('redis.url'));
conf.set('redis.options.host', redis_url.hostname);
conf.set('redis.options.port', redis_url.port);
Expand Down
3 changes: 2 additions & 1 deletion config/test_config.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
{

"port": 5536,
"mongo": "mongodb://localhost/todo-test"
}
39 changes: 24 additions & 15 deletions controllers/auth.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
var AuthController = function(){

var
Settings = require("../config/settings"),
conf = require("../config/settings"),
User = require("../models/user"),
AuthUtils = require("../utils/auth"),
JSONUtils = require("../utils/json"),
Expand Down Expand Up @@ -31,25 +31,27 @@ var AuthController = function(){
.findOne({
_id: user._id || user
})
.populate('services.clientService')
.lean()
.exec(function(err, user){
if(err) return done(err);
delete user.hashedPassword;
delete user.__v;

return done(err, user);
});
};

var _generateToken = function(data){
var random = Math.floor(Math.random() * 100001);
var timestamp = (new Date()).getTime();
var sha256 = crypto.createHmac("sha256", random + Settings.auth.token.salt + timestamp);
var sha256 = crypto.createHmac("sha256", random + conf.get('auth.token.salt') + timestamp);
return sha256.update(data).digest("base64");
};

var _saveToken = function(token, user, done) {
var
id = Settings.redis.prefix + token,
maxAge = Settings.auth.token.maxAge;
id = conf.get('redis.prefix') + token,
maxAge = conf.get('auth.token.maxAge');

user = JSON.stringify(user);

Expand All @@ -59,7 +61,8 @@ var AuthController = function(){
};

var _getTokenData = function(token, done) {
var id = Settings.redis.prefix + token;
console.log("getting token data");
var id = conf.get('redis.prefix') + token;

rclient.get(id, function(err, data){
if (err || !data) return done(err);
Expand All @@ -68,31 +71,32 @@ var AuthController = function(){
};

var _clearTokenData = function(token, done) {
var id = Settings.redis.prefix + token;
var id = conf.get('redis.prefix') + token;

rclient.del(id, function(err, data){
if (err || !data) return done(err);
return done();
});
};

var _validateClient = function(id, secret, done){
console.log("validateClient %s %s", id, secret);
var _validateClient = function(client, req, done){
// console.log("validateClient", client.clientId, client.clientSecret);
// TODO: eventually we want to validate who this is coming from, but this is fine for the moment
return done(null,true);
};

var _grantUserToken = function(email, password, done){
console.log("grantUserToken %s, %s", email, password);
var hashedPassword = AuthUtils.hashPassword(password);
var _grantUserToken = function(grant, req, done){
var hashedPassword = AuthUtils.hashPassword(grant.password);
User.Model
.findOne({
email: email.toLowerCase(),
email: grant.username.toLowerCase(),
hashedPassword: hashedPassword
})
.exec(function(err, user){
console.log("user ", user);
if(err || !user) return done(err, false);

var token = _generateToken(email + ":" + password);
var token = _generateToken(grant.username + ":" + grant.password);

_saveToken(token, user);

Expand All @@ -102,8 +106,13 @@ var AuthController = function(){

};

var _authenticateToken = function(token, done) {
var _authenticateToken = function(token, req, done) {
_getTokenData(token, function(err, data){
delete data.hashedPassword;
delete data.__v;

req.user = data;
console.log("setting user %j", data);
return done(err, data);
});
};
Expand Down
1 change: 1 addition & 0 deletions controllers/users.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ var UsersController = function(){
var _current = function(req, res, next) {
var
user = req.user;
console.log("user %j", user);
return res.send(user);

};
Expand Down
47 changes: 31 additions & 16 deletions gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,45 @@ var
mocha = require('gulp-mocha'),
jshint = require('gulp-jshint'),
exit = require('gulp-exit'),
Q = require('q');
Q = require('q'),
TestData = require("./test/utils/data");

process.env.PORT = 4000;
process.env.MONGO_DEBUG = true;

gulp.task('setup-e2e-data', function(callback){
var E2EData = require(__dirname + '/./e2e/data');
E2EData.createTestData(function(err) {
gulp.task('setup-test-data',['clear-test-data'], function(callback){
TestData.createTestData(function(err){
return callback(err);
});
});

gulp.task('clear-e2e-data', function(callback){
var E2EData = require(__dirname + '/./e2e/data');
E2EData.clearDatabase(function(err){
return callback(err).pipe(exit());
gulp.task('clear-test-data', function(callback){
TestData.clearDatabase(function(err){
return callback(err);
});
});

gulp.task('start-server', function() {
gulp.task('start-test-server', function() {

var conf = require("./config/settings");
GLOBAL.server = "http://localhost:" + conf.get('port');
var
app = require(__dirname + '/./app');
});

gulp.task('run-tests',['start-test-server'], function() {
return gulp.src(['test/specs/*.test.js'], { read: false })
.pipe(mocha({
reporter: 'spec',
globals: {
should: require('should')
}
}))
.pipe(exit());
});

var
app = require(__dirname + '/./app');
gulp.task('lint', function(done) {
return gulp.src(['./lib/*.js', 'test/*.test.js'])
.pipe(jshint())
.pipe(jshint.reporter('default'));
});

gulp.task('clean-populate', ['clear-e2e-data','setup-e2e-data']);
gulp.task('default', ['clear-e2e-data','setup-e2e-data', 'start-server']);
gulp.task('clean-populate', ['clear-test-data','setup-test-data']);
gulp.task('default', ['clean-populate', 'run-tests']);
28 changes: 28 additions & 0 deletions models/todo.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
var TodoModel = function(){

var
mongoose = require("mongoose"),
Schema = mongoose.Schema;

var _jsonSchema = {
_id: {type:Schema.Types.ObjectId, "default":mongoose.Types.ObjectId},
text: String,
created: {type: Date, "default": Date.now},
completed: {type:Boolean, "default": false},
completedOn: Date,
position: {type:Number, "default":0}
};

var _schema = mongoose.Schema(_jsonSchema);

var _model = mongoose.model("Todo", _schema);

return {
Schema: _schema,
Model: _model,
jsonSchema: _jsonSchema
};

}();

module.exports = TodoModel;
3 changes: 2 additions & 1 deletion models/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ var UserModel = function(){
_id: {type:Schema.Types.ObjectId, "default":mongoose.Types.ObjectId},
name: String,
email: String,
hashedPassword: String
hashedPassword: String,
created: {type: Date, "default": Date.now}
};

var _schema = mongoose.Schema(_jsonSchema);
Expand Down
11 changes: 11 additions & 0 deletions test/data/users.data.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module.exports = [
{
name: "Warner Onstine",
email: "warner@test.com"
},
{
name: "Warner Test2",
email: "warner2@test.com"
}

];
Loading

0 comments on commit a8ec1ce

Please sign in to comment.