add dotenv, start to add signup

This commit is contained in:
catarak 2016-06-09 13:56:23 -04:00
parent 4e1ea2d1fc
commit 1f75b4d390
9 changed files with 47 additions and 19 deletions

1
.gitignore vendored
View file

@ -5,3 +5,4 @@ dump.rdb
public/* public/*
static/dist static/dist
static/css/app.min.css static/css/app.min.css
.env

View file

@ -26,3 +26,4 @@ As this project is currently being developed, there is only development mode.
* https://github.com/jsbin/jsbin (especially look at the console) * https://github.com/jsbin/jsbin (especially look at the console)
* Need to figure out how to solve the XSS issue, https://github.com/jsbin/jsbin/wiki/Best-practices-for-building-your-own-live-paste-bin * Need to figure out how to solve the XSS issue, https://github.com/jsbin/jsbin/wiki/Best-practices-for-building-your-own-live-paste-bin
* https://www.npmjs.com/package/express-subdomain * https://www.npmjs.com/package/express-subdomain
* https://medium.com/@rajaraodv/securing-react-redux-apps-with-jwt-tokens-fcfe81356ea0#.i3agwmf2w

View file

@ -1,3 +1,4 @@
require('babel-register'); require('babel-register');
require('babel-polyfill'); require('babel-polyfill');
require('dotenv').config();
require('./server/server'); require('./server/server');

View file

@ -40,10 +40,13 @@
"codemirror": "^5.14.2", "codemirror": "^5.14.2",
"connect-mongo": "^1.2.0", "connect-mongo": "^1.2.0",
"cookie-parser": "^1.4.1", "cookie-parser": "^1.4.1",
"dotenv": "^2.0.0",
"express": "^4.13.4", "express": "^4.13.4",
"jwt-simple": "^0.5.0",
"mongoose": "^4.4.16", "mongoose": "^4.4.16",
"passport": "^0.3.2", "passport": "^0.3.2",
"passport-github": "^1.1.0", "passport-github": "^1.1.0",
"passport-jwt": "^2.0.0",
"passport-local": "^1.0.0", "passport-local": "^1.0.0",
"react": "^15.0.2", "react": "^15.0.2",
"react-dom": "^15.0.2", "react-dom": "^15.0.2",

View file

@ -1,9 +1,17 @@
const passport = require('passport'); const passport = require('passport');
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const GitHubStrategy = require('passport-github').Strategy; const GitHubStrategy = require('passport-github').Strategy;
const LocalStrategy = require('passport-local').Strategy; const LocalStrategy = require('passport-local').Strategy;
const User = require('../models/user'); const User = require('../models/user');
// Setup options for JWT Strategy
const jwtOptions = {
jwtFromRequest: ExtractJwt.fromHeader('authorization'),
secretOrKey: "steve brule"
};
passport.serializeUser((user, done) => { passport.serializeUser((user, done) => {
done(null, user.id); done(null, user.id);
}); });
@ -31,6 +39,22 @@ passport.use(new LocalStrategy({ usernameField: 'email' }, (email, password, don
}); });
})); }));
// Create JWT strategy
passport.use(new JwtStrategy(jwtOptions, function(payload, done) {
// See if the user ID in the payload exists in our database
// If it does, call 'done' with that other
// otherwise, call done without a user object
User.findById(payload.sub, function(err, user) {
if (err) { return done(err, false); }
if (user) {
done(null, user);
} else {
done(null, false);
}
});
}));
/** /**
* Sign in with GitHub. * Sign in with GitHub.
*/ */

View file

@ -1,6 +1,7 @@
import User from '../models/user' import User from '../models/user'
import passport from 'passport' import passport from 'passport'
import path from 'path' import path from 'path'
import { generateToken } from '../utils/jwt'
export function newUser(req, res) { export function newUser(req, res) {
//eventually, it would be cool to have some isomorphic rendering //eventually, it would be cool to have some isomorphic rendering
@ -8,6 +9,7 @@ export function newUser(req, res) {
} }
export function createUser(req, res, next) { export function createUser(req, res, next) {
console.log("in create user");
const user = new User({ const user = new User({
email: req.body.email, email: req.body.email,
password: req.body.password password: req.body.password
@ -15,9 +17,7 @@ export function createUser(req, res, next) {
User.findOne({email: req.body.email}, (err, existingUser) => { User.findOne({email: req.body.email}, (err, existingUser) => {
if (existingUser) { if (existingUser) {
//error, already registered return res.status(422).send({ error: 'Email is in use' });
//should probably redirect client side though?
return res.redirect('/signup');
} }
user.save((err) => { user.save((err) => {
if (err) { return next(err); } if (err) { return next(err); }
@ -25,7 +25,7 @@ export function createUser(req, res, next) {
if (err) { if (err) {
return next(err); return next(err);
} }
res.redirect('/'); res.json({ token: generateToken(user) });
}); });
}); });
}); });

View file

@ -24,30 +24,25 @@ import serverConfig from './config';
import users from './routes/user.routes'; import users from './routes/user.routes';
//Body parser, cookie parser, sessions, serve public assets //Body parser, cookie parser, sessions, serve public assets
const MongoStore = require('connect-mongo')(session);
app.use(Express.static(path.resolve(__dirname, '../static'))); app.use(Express.static(path.resolve(__dirname, '../static')));
app.use(bodyParser.urlencoded({extended: true})); app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json()); app.use(bodyParser.json());
app.use(cookieParser()); app.use(cookieParser());
app.use(session({
//this should be SECRET AND IN A SECRET FILE
//TODO add dotenv
secret: 'steve brule',
resave: true,
saveUninitialized: true,
store: new MongoStore({
// url: process.env.MONGODB_URI || process.env.MONGOLAB_URI,
url: serverConfig.mongoURL,
autoReconnect: true
})
}));
app.use(passport.initialize()); app.use(passport.initialize());
app.use(passport.session()); app.use(passport.session());
app.use('/', users); app.use('/', users);
const passportConfig = require('./config/passport'); const passportConfig = require('./config/passport');
//Connect to MongoDB
// mongoose.connect(process.env.MONGODB_URI || process.env.MONGOLAB_URI);
mongoose.connect(serverConfig.mongoURL);
mongoose.connection.on('error', () => {
console.error('MongoDB Connection Error. Please make sure that MongoDB is running.');
process.exit(1);
});
app.get("/", function(req, res) { app.get("/", function(req, res) {
res.sendFile(path.resolve(__dirname + '/../index.html')); res.sendFile(path.resolve(__dirname + '/../index.html'));
}) })

View file

@ -3,7 +3,7 @@ import React from 'react'
class SignupView extends React.Component { class SignupView extends React.Component {
render() { render() {
return ( return (
<form> <form onSubmit={this.handleSubmit()}>
<input type="text" placeholder="Username"/> <input type="text" placeholder="Username"/>
<input type="text" placeholder="Email"/> <input type="text" placeholder="Email"/>
<input type="password" placeholder="Password"/> <input type="password" placeholder="Password"/>

View file

@ -8,3 +8,6 @@ export const OPEN_PREFERENCES = 'OPEN_PREFERENCES';
export const CLOSE_PREFERENCES = 'CLOSE_PREFERENCES'; export const CLOSE_PREFERENCES = 'CLOSE_PREFERENCES';
export const INCREASE_FONTSIZE = 'INCREASE_FONTSIZE'; export const INCREASE_FONTSIZE = 'INCREASE_FONTSIZE';
export const DECREASE_FONTSIZE = 'DECREASE_FONTSIZE'; export const DECREASE_FONTSIZE = 'DECREASE_FONTSIZE';
export const AUTH_USER = 'AUTH_USER';
export const UNAUTH_USER = 'UNAUTH_USER';