Creating and setting jwt is working

This commit is contained in:
Scott Tolksdorf 2016-11-02 10:28:56 -04:00
parent 5a45da4d79
commit 2618341bb7
6 changed files with 152 additions and 26 deletions

View File

@ -53,6 +53,41 @@ const LoginPage = React.createClass({
return;
}
console.log('making cookie');
document.cookie = "session="+res.body+"; path=/";
this.setState({
processing : false,
errors : null,
success : true
}, ()=> {
if(this.props.redirect) window.location = this.props.redirect;
})
});
},
signup : function(){
this.setState({
processing : true,
errors: null
});
request.post('/signup')
.send({
user : this.state.username,
pass : this.state.password,
})
.end((err, res) => {
this.setState({processing : false });
if(err){
console.log('EROR', err);
return;
}
console.log(res);
this.setState({
processing : false,
errors : null,
@ -73,6 +108,9 @@ const LoginPage = React.createClass({
return <div> success</div>
},
//Add detection for being logged in
//Add a lil logout button
render : function(){
return <div className='loginPage'>
<div className='content'>
@ -86,6 +124,7 @@ const LoginPage = React.createClass({
<input type='text' onChange={this.handlePassChange} value={this.state.password} />
<button onClick={this.handleLoginClick}>login</button>
<button onClick={this.signup}>signup</button>
{this.renderProcessing()}
{this.renderSuccess()}

View File

@ -13,6 +13,7 @@ let Router;
const Naturalcrit = React.createClass({
getDefaultProps: function() {
return {
user : {},
url : ''
};
},
@ -33,6 +34,7 @@ const Naturalcrit = React.createClass({
});
},
render : function(){
console.log(this.props);
return <div className='naturalcrit'>
<Router initialUrl={this.props.url}/>
</div>

View File

@ -13,8 +13,10 @@
"bcrypt-nodejs": "0.0.3",
"body-parser": "^1.15.2",
"classnames": "^2.2.0",
"cookie-parser": "^1.4.3",
"express": "^4.13.3",
"gulp": "^3.9.0",
"jwt-simple": "^0.5.0",
"lodash": "^4.11.2",
"mongoose": "^4.6.5",
"pico-router": "^1.1.1",

View File

@ -1,17 +1,19 @@
'use strict';
var _ = require('lodash');
const _ = require('lodash');
require('app-module-path').addPath('./shared');
var vitreumRender = require('vitreum/render');
var bodyParser = require('body-parser')
var express = require("express");
var app = express();
const vitreumRender = require('vitreum/render');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
const express = require("express");
const app = express();
app.use(express.static(__dirname + '/build'));
app.use(bodyParser.json());
app.use(cookieParser());
//Mongoose
var mongoose = require('mongoose');
var mongoUri = process.env.MONGODB_URI || process.env.MONGOLAB_URI || 'mongodb://localhost/naturalcrit';
const mongoose = require('mongoose');
const mongoUri = process.env.MONGODB_URI || process.env.MONGOLAB_URI || 'mongodb://localhost/naturalcrit';
mongoose.connect(mongoUri);
mongoose.connection.on('error', function(){
console.log(">>>ERROR: Run Mongodb.exe ya goof!");
@ -20,36 +22,80 @@ mongoose.connection.on('error', function(){
const AccountModel = require('./server/account.model.js').model;
//Homebrew Reidrect
app.all('/homebrew*', (req, res) => {
return res.redirect(302, 'http://homebrewery.naturalcrit.com' + req.url.replace('/homebrew', ''));
});
//Bumpo these out to a api file
app.post('/login', (req, res) => {
const user = req.body.user;
const pass = req.body.pass;
AccountModel.login(user, pass)
.then((jwt) => {
return res.json(jwt);
})
.catch((err) => {
return res.json(err);
});
//return res.status(200).send();
});
app.post('/signup', (req, res) => {
const user = req.body.user;
const pass = req.body.pass;
console.log(user, pass);
//move to account model
var newAccount = new AccountModel({
username : user,
password : pass
});
newAccount.save(function(err, obj){
if(err){
console.error(err, err.toString(), err.stack);
return res.status(500).send(`Error while creating new account, ${err.toString()}`);
}
return res.json(obj);
});
return res.status(200).send();
});
const jwt = require('jwt-simple');
app.get('/test', (req, res) => {
console.log('cookies', req.cookies);
if(req.cookies.session){
const cool = jwt.decode(req.cookies.session, 'secret');
return res.json(cool)
}
});
const accountMW = (req, res, next) => {
if(req.cookies && req.cookies.session){
req.user = jwt.decode(req.cookies.session, 'secret');
}
return next();
}
//Render Page
app.get('*', (req, res) => {
app.get('*', accountMW, (req, res) => {
vitreumRender({
page: './build/naturalcrit/bundle.dot',
globals:{},
prerenderWith : './client/naturalcrit/naturalcrit.jsx',
initialProps: {
user : req.user,
url: req.originalUrl,
},
clearRequireCache : !process.env.PRODUCTION,

10
server/account.jwt.js Normal file
View File

@ -0,0 +1,10 @@
const jwt = require('jwt-simple');
module.exports = (key) => {
return {
}
};

View File

@ -1,8 +1,11 @@
const mongoose = require('mongoose');
const _ = require('lodash');
const jwt = require('jwt-simple');
const bcrypt = require('bcrypt-nodejs');
const SALT_WORK_FACTOR = 10;
const SECRET = 'secret';
const AccountSchema = mongoose.Schema({
username: { type: String, required: true, index: { unique: true } },
@ -13,23 +16,44 @@ const AccountSchema = mongoose.Schema({
AccountSchema.pre('save', function(next) {
const account = this;
// only hash the password if it has been modified (or is new)
if (!account.isModified('password')) return next();
// generate a salt
bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) {
if (err) return next(err);
// hash the password along with our new salt
bcrypt.hash(account.password, salt, function(err, hash) {
if (err) return next(err);
account.password = hash;
next();
});
});
const salt = bcrypt.genSaltSync(SALT_WORK_FACTOR);
const hash = bcrypt.hashSync(account.password, salt);
if(!hash) return next({ok : false, msg : 'err making password hash'});
account.password = hash;
return next();
});
AccountSchema.methods.checkPassword = (candidatePassword) => {
AccountSchema.statics.login = function(username, pass){
return new Promise((resolve, reject) => {
Account.find({username : username}, (err, users) => {
if(err) return reject(err);
if(!users || users.length == 0) return reject({ ok : false, msg : 'no User'});
const user = users[0];
user.checkPassword(pass)
.then((isMatch) => {
if(!isMatch) return reject({ok : false, msg : 'Bad pass'});
return resolve(user.getJWT());
})
.catch(reject)
});
});
}
AccountSchema.statics.signup = function(username, pass){
return new Promise((resolve, reject) => {
//try to find existing user, fail if found
//create new entry
//getJWT for new entry
//return it
});
};
AccountSchema.methods.checkPassword = function(candidatePassword) {
return new Promise((resolve, reject) => {
bcrypt.compare(candidatePassword, this.password, function(err, isMatch) {
if (err) return reject(err);
@ -38,11 +62,14 @@ AccountSchema.methods.checkPassword = (candidatePassword) => {
});
};
AccountSchema.methods.getJWT = () => {
return new Promise((resolve, reject) => {
AccountSchema.methods.getJWT = function(){
const payload = this.toJSON();
payload.issued = (new Date());
delete payload.password;
delete payload._id;
});
return jwt.encode(payload, SECRET);
};