add sign jwt function and hook to auth/signup
This commit is contained in:
parent
a629225fae
commit
7b4b48050d
10 changed files with 223 additions and 11 deletions
|
@ -1,7 +1,15 @@
|
||||||
|
const signToken = require('../services/signToken');
|
||||||
|
|
||||||
|
const signUp = async (req, res, next) => {
|
||||||
const signUp = (req, res, next) => {
|
|
||||||
|
const user = req.body;
|
||||||
|
try {
|
||||||
|
signToken(res, user);
|
||||||
|
res.send('ok').status(200);
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
res.status(500).json(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const login = (req, res, next) => {
|
const login = (req, res, next) => {
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
const knex = require('knex');
|
const knex = require('knex');
|
||||||
const knexfile = require('../knexfile');
|
const knexConfig = require('../knexConfig');
|
||||||
|
|
||||||
|
|
||||||
const env = process.env.NODE_ENV || 'development';
|
const env = process.env.NODE_ENV || 'development';
|
||||||
const configOptions = knexfile[env];
|
const configOptions = knexConfig[env];
|
||||||
|
|
||||||
module.exports = knex(configOptions);
|
module.exports = knex(configOptions);
|
|
@ -1,8 +1,6 @@
|
||||||
|
|
||||||
exports.up = function(knex) {
|
exports.up = function(knex) {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.down = function(knex) {
|
exports.down = function(knex) {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -316,6 +316,11 @@
|
||||||
"integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
|
"integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"buffer-equal-constant-time": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
|
||||||
|
"integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
|
||||||
|
},
|
||||||
"buffer-writer": {
|
"buffer-writer": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
|
||||||
|
@ -746,6 +751,14 @@
|
||||||
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
|
||||||
"integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
|
"integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
|
||||||
},
|
},
|
||||||
|
"ecdsa-sig-formatter": {
|
||||||
|
"version": "1.0.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
|
||||||
|
"integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
|
||||||
|
"requires": {
|
||||||
|
"safe-buffer": "^5.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"ee-first": {
|
"ee-first": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
||||||
|
@ -1644,6 +1657,54 @@
|
||||||
"esprima": "^4.0.0"
|
"esprima": "^4.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"jsonwebtoken": {
|
||||||
|
"version": "8.5.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
|
||||||
|
"integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
|
||||||
|
"requires": {
|
||||||
|
"jws": "^3.2.2",
|
||||||
|
"lodash.includes": "^4.3.0",
|
||||||
|
"lodash.isboolean": "^3.0.3",
|
||||||
|
"lodash.isinteger": "^4.0.4",
|
||||||
|
"lodash.isnumber": "^3.0.3",
|
||||||
|
"lodash.isplainobject": "^4.0.6",
|
||||||
|
"lodash.isstring": "^4.0.1",
|
||||||
|
"lodash.once": "^4.0.0",
|
||||||
|
"ms": "^2.1.1",
|
||||||
|
"semver": "^5.6.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"ms": {
|
||||||
|
"version": "2.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||||
|
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
||||||
|
},
|
||||||
|
"semver": {
|
||||||
|
"version": "5.7.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
|
||||||
|
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"jwa": {
|
||||||
|
"version": "1.4.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
|
||||||
|
"integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
|
||||||
|
"requires": {
|
||||||
|
"buffer-equal-constant-time": "1.0.1",
|
||||||
|
"ecdsa-sig-formatter": "1.0.11",
|
||||||
|
"safe-buffer": "^5.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"jws": {
|
||||||
|
"version": "3.2.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
|
||||||
|
"integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
|
||||||
|
"requires": {
|
||||||
|
"jwa": "^1.4.1",
|
||||||
|
"safe-buffer": "^5.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"kind-of": {
|
"kind-of": {
|
||||||
"version": "6.0.2",
|
"version": "6.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
|
||||||
|
@ -1726,6 +1787,41 @@
|
||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
|
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
|
||||||
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
|
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
|
||||||
},
|
},
|
||||||
|
"lodash.includes": {
|
||||||
|
"version": "4.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
|
||||||
|
"integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
|
||||||
|
},
|
||||||
|
"lodash.isboolean": {
|
||||||
|
"version": "3.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
|
||||||
|
"integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
|
||||||
|
},
|
||||||
|
"lodash.isinteger": {
|
||||||
|
"version": "4.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
|
||||||
|
"integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
|
||||||
|
},
|
||||||
|
"lodash.isnumber": {
|
||||||
|
"version": "3.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
|
||||||
|
"integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
|
||||||
|
},
|
||||||
|
"lodash.isplainobject": {
|
||||||
|
"version": "4.0.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
|
||||||
|
"integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
|
||||||
|
},
|
||||||
|
"lodash.isstring": {
|
||||||
|
"version": "4.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
|
||||||
|
"integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
|
||||||
|
},
|
||||||
|
"lodash.once": {
|
||||||
|
"version": "4.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
|
||||||
|
"integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
|
||||||
|
},
|
||||||
"log-symbols": {
|
"log-symbols": {
|
||||||
"version": "2.2.0",
|
"version": "2.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
"test": "mocha ./test/*",
|
"test": "mocha ./test/*",
|
||||||
"make-migration": "./node_modules/.bin/knex migrate:make",
|
"make-migration": "./node_modules/.bin/knex migrate:make",
|
||||||
"migrate": "./node_modules/.bin/knex migrate:latest",
|
"migrate": "./node_modules/.bin/knex migrate:latest",
|
||||||
|
"migrate-test": "./node_modules/.bin/knex migrate:latest --env test",
|
||||||
"seed": "./node_modules/.bin/knex seed:run"
|
"seed": "./node_modules/.bin/knex seed:run"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
@ -16,6 +17,7 @@
|
||||||
"dotenv": "^8.2.0",
|
"dotenv": "^8.2.0",
|
||||||
"express": "~4.16.1",
|
"express": "~4.16.1",
|
||||||
"http-errors": "~1.6.3",
|
"http-errors": "~1.6.3",
|
||||||
|
"jsonwebtoken": "^8.5.1",
|
||||||
"knex": "^0.20.7",
|
"knex": "^0.20.7",
|
||||||
"morgan": "~1.9.1",
|
"morgan": "~1.9.1",
|
||||||
"pg": "^7.17.0",
|
"pg": "^7.17.0",
|
||||||
|
|
|
@ -38,7 +38,7 @@ app.use('/', indexRouter);
|
||||||
app.use('/users', usersRouter);
|
app.use('/users', usersRouter);
|
||||||
app.use('/auth', authRouter);
|
app.use('/auth', authRouter);
|
||||||
// @auth
|
// @auth
|
||||||
app.use('/api', apiRouter);
|
app.use('/api/v1', apiRouter);
|
||||||
|
|
||||||
// catch 404 and forward to error handler
|
// catch 404 and forward to error handler
|
||||||
app.use(function(req, res, next) {
|
app.use(function(req, res, next) {
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
const jwt = require('jsonwebtoken');
|
||||||
|
require('dotenv').config();
|
||||||
|
|
||||||
|
const msDayOffset = 86400000;
|
||||||
|
const msHourOffset = 3600000;
|
||||||
|
|
||||||
|
const signToken = (res, user) => {
|
||||||
|
const expiration = process.env.NODE_ENV === 'test' ? msHourOffset : msDayOffset;
|
||||||
|
const secret = process.env.NODE_ENV === 'test' ? process.env.TEST_SECRET : process.env.JWT_SECRET;
|
||||||
|
console.log(process.env.NODE_ENV)
|
||||||
|
const token = jwt.sign({ user }, secret, {
|
||||||
|
expiresIn: process.env.NODE_ENV === 'test' ? '1h' : '24h',
|
||||||
|
});
|
||||||
|
return res.cookie('token', token, {
|
||||||
|
expires: new Date(Date.now() + expiration),
|
||||||
|
secure: false, // set to true if your using https
|
||||||
|
httpOnly: true,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
module.exports = signToken;
|
|
@ -0,0 +1,32 @@
|
||||||
|
const authSpec = (chai, server) => {
|
||||||
|
const newUserFormData = {
|
||||||
|
'username':'newUser',
|
||||||
|
'password':'password',
|
||||||
|
'email':'user@example.com'
|
||||||
|
}
|
||||||
|
|
||||||
|
it('post to sign up should return 200 status', done => {
|
||||||
|
chai.request(server)
|
||||||
|
.post('/auth/signup')
|
||||||
|
.type('form')
|
||||||
|
.send(newUserFormData)
|
||||||
|
.end((err, res) => {
|
||||||
|
if (err) done(err);
|
||||||
|
res.should.status(200);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('post to sign up should return token', done => {
|
||||||
|
chai.request(server)
|
||||||
|
.post('/auth/signup')
|
||||||
|
.type('form')
|
||||||
|
.send(newUserFormData)
|
||||||
|
.end((err, res) => {
|
||||||
|
if (err) done(err);
|
||||||
|
res.should.cookie('token');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
module.exports = authSpec;
|
|
@ -2,19 +2,75 @@ process.env.NODE_ENV = 'test';
|
||||||
|
|
||||||
const chai = require('chai');
|
const chai = require('chai');
|
||||||
const chaiHttp = require('chai-http');
|
const chaiHttp = require('chai-http');
|
||||||
|
var knex = require('../data/db');
|
||||||
|
|
||||||
const app = require('../server');
|
const server = require('../server');
|
||||||
|
|
||||||
const should = chai.should();
|
const should = chai.should();
|
||||||
|
|
||||||
|
// const authSpec = require('./auth.spec');
|
||||||
|
|
||||||
chai.use(chaiHttp);
|
chai.use(chaiHttp);
|
||||||
// ! to run tests from other testing modules
|
// ! to run tests from other testing modules
|
||||||
// import someTest from './endpoint/someTest';
|
// import someTest from './endpoint/someTest';
|
||||||
|
|
||||||
|
const setupDb = () => {
|
||||||
|
beforeEach(done => {
|
||||||
|
knex.migrate.rollback(true)
|
||||||
|
.then(() => knex.migrate.latest())
|
||||||
|
.then(() => done());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('Auth Routes', function() {
|
||||||
|
setupDb();
|
||||||
|
|
||||||
|
// authSpec(chai, server)
|
||||||
|
|
||||||
|
const newUserFormData = {
|
||||||
|
'username':'newUser',
|
||||||
|
'password':'password',
|
||||||
|
'email':'user@example.com'
|
||||||
|
}
|
||||||
|
|
||||||
|
it('post to sign up should return 200 status', function(done) {
|
||||||
|
chai.request(server)
|
||||||
|
.post('/auth/signup')
|
||||||
|
.type('form')
|
||||||
|
.send(newUserFormData)
|
||||||
|
.end((err, res) => {
|
||||||
|
if (err) done(err);
|
||||||
|
res.should.status(200);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('post to sign up should return token', done => {
|
||||||
|
chai.request(server)
|
||||||
|
.post('/auth/signup')
|
||||||
|
.type('form')
|
||||||
|
.send(newUserFormData)
|
||||||
|
.end((err, res) => {
|
||||||
|
if (err) done(err);
|
||||||
|
res.should.cookie('token');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
describe('API Routes', function() {
|
describe('API Routes', function() {
|
||||||
// ! should be a function that returns tests to be run
|
setupDb();
|
||||||
// someTest(chai)
|
|
||||||
|
it('home should return 200 status', done => {
|
||||||
|
chai.request(server)
|
||||||
|
.get('/')
|
||||||
|
.end((err,res)=> {
|
||||||
|
if(err) done(err);
|
||||||
|
res.should.status(200);
|
||||||
|
done();
|
||||||
|
})
|
||||||
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue