-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
module.exports = { | ||
jwtSecret: process.env.JWT_SECRET || "keep it secret, keep it safe!", | ||
}; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
const express = require('express'); | ||
const cors = require('cors'); | ||
const helmet = require('helmet'); | ||
|
||
const authenticate = require('../auth/authenticate-middleware.js'); | ||
const authRouter = require('../auth/auth-router.js'); | ||
const usersRouter = require('../users/users-router.js'); | ||
//const productsRouter = require('../products/products-router.js'); | ||
|
||
const server = express(); | ||
|
||
server.use(helmet()); | ||
server.use(cors()); | ||
server.use(express.json()); | ||
|
||
server.use('/api/auth', authRouter); | ||
server.use('/api/users', authenticate, usersRouter); | ||
//server.use('/api/products', productsRouter); | ||
|
||
|
||
server.get("/", (req, res) => { | ||
res.status(200).json({ api: "up" }); | ||
}); | ||
|
||
module.exports = server; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
const router = require('express').Router(); | ||
const bcrypt = require("bcryptjs"); | ||
const jwt = require("jsonwebtoken"); | ||
|
||
const Users = require("../users/users-model.js"); | ||
const secrets = require("../api/secrets.js"); | ||
|
||
//const validateUser = require("../middleware/validateUser"); | ||
|
||
router.post('/register', (req, res) => { | ||
|
||
let user = req.body; // username, password | ||
const rounds = process.env.HASH_ROUNDS || 14; | ||
const hash = bcrypt.hashSync(user.password, rounds); | ||
|
||
|
||
user.password = hash; | ||
|
||
Users.add(user) | ||
.then(saved => { | ||
res.status(201).json(saved); | ||
}) | ||
.catch(error => { | ||
console.log(error.message); | ||
res.status(500).json({ errorMessage: error.message }); | ||
}); | ||
}); | ||
|
||
router.post('/login', (req, res) => { | ||
|
||
let { username, password } = req.body; | ||
|
||
|
||
Users.findBy({ username }) | ||
.then(([user]) => { | ||
|
||
|
||
if (user && bcrypt.compareSync(password, user.password)) { | ||
|
||
const token = generateToken(user); | ||
|
||
|
||
res.status(200).json({ message: "Welcome!", token, id: user.id }); | ||
} else { | ||
res.status(401).json({ message: "You cannot pass!" }); | ||
} | ||
}) | ||
.catch(error => { | ||
console.log(error); | ||
res.status(500).json({ errorMessage: error.message }); | ||
}); | ||
}); | ||
|
||
function generateToken(user) { | ||
|
||
const payload = { | ||
userId: user.id, | ||
username: user.username, | ||
}; | ||
const secret = secrets.jwtSecret; | ||
const options = { | ||
expiresIn: "1d", | ||
}; | ||
|
||
return jwt.sign(payload, secret, options); | ||
} | ||
|
||
module.exports = router; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
const jwt = require("jsonwebtoken"); | ||
const secrets = require("../api/secrets.js"); | ||
|
||
module.exports = (req, res, next) => { | ||
const token = req.headers.authorization; | ||
|
||
const secret = secrets.jwtSecret; | ||
|
||
if (token) { | ||
// verify that the token is valid | ||
jwt.verify(token, secret, (error, decodedToken) => { | ||
// if everything is good with the token, the error will be undefined | ||
if (error) { | ||
res.status(401).json({ you: "shall not pass!" }); | ||
} else { | ||
req.decodedToken = decodedToken; | ||
|
||
next(); | ||
} | ||
}); | ||
} else { | ||
res.status(400).json({ message: "Please provide credentials" }); | ||
} | ||
|
||
}; | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
const knex = require('knex'); | ||
|
||
const knexConfig = require('../knexfile.js'); | ||
|
||
const environment = process.env.DB_ENV || "development" | ||
|
||
module.exports = knex(knexConfig[environment]); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
const server = require('./api/server.js'); | ||
|
||
const PORT = process.env.PORT || 4000; | ||
server.listen(PORT, () => { | ||
console.log(`\n=== Server listening on port ${PORT} ===\n`); | ||
}); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
// Update with your config settings. | ||
|
||
module.exports = { | ||
|
||
development: { | ||
client: 'sqlite3', | ||
useNullAsDefault: true, | ||
connection: { | ||
filename: './data/auth.db3' | ||
} | ||
}, | ||
|
||
staging: { | ||
client: 'postgresql', | ||
connection: { | ||
database: 'my_db', | ||
user: 'username', | ||
password: 'password' | ||
}, | ||
pool: { | ||
min: 2, | ||
max: 10 | ||
}, | ||
migrations: { | ||
tableName: 'knex_migrations' | ||
} | ||
}, | ||
|
||
production: { | ||
client: 'pg', | ||
connection: process.env.DATABASE_URL, | ||
pool: { | ||
min: 2, | ||
max: 10 | ||
}, | ||
migrations: { | ||
directory: './data/migrations' | ||
} | ||
} | ||
|
||
}; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
|
||
exports.up = function(knex) { | ||
return knex.schema | ||
.createTable('users', users=>{ | ||
users.increments(); | ||
users.string('username', 255).notNullable().unique(); | ||
users.string('password', 255).notNullable(); | ||
users.string('email').notNullable(); | ||
}) | ||
}; | ||
|
||
exports.down = function(knex) { | ||
return knex.schema | ||
.dropTableIfExists('users'); | ||
|
||
}; |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.