Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 108 additions & 0 deletions jwt-prac/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
require("dotenv").config();
require("./config/database").connect();
const express = require("express");

const app = express();

app.use(express.json());

// Logic goes here
// importing user context
const User = require("./model/user");

//Welcome routes to test auth
const auth = require("./middleware/auth");

app.post("/welcome", auth, (req, res) => {
res.status(200).send("Welcome 🙌 ");
}); //We can now add a token in the header with the key x-access-token and re-test.


// Register
app.post("/register", (req, res) => {
// our register logic goes here...
// Our register logic starts here
try {
// Get user input
const { first_name, last_name, email, password } = req.body;

// Validate user input
if (!(email && password && first_name && last_name)) {
res.status(400).send("All input is required");
}

// check if user already exist
// Validate if user exist in our database
const oldUser = await User.findOne({ email });

if (oldUser) {
return res.status(409).send("User Already Exist. Please Login");
}

//Encrypt user password
encryptedPassword = await bcrypt.hash(password, 10);

// Create user in our database
const user = await User.create({
first_name,
last_name,
email: email.toLowerCase(), // sanitize: convert email to lowercase
password: encryptedPassword,
});
// Create token
const token = jwt.sign(
{ user_id: user._id, email },
process.env.TOKEN_KEY,
{
expiresIn: "2h",
}
);
// save user token
user.token = token;

// return new user
res.status(201).json(user);
} catch (err) {
console.log(err);
}
// Our register logic ends here
});

// Login
app.post("/login", (req, res) => {
// our login logic goes here
// Our login logic starts here
try {
// Get user input
const { email, password } = req.body;

// Validate user input
if (!(email && password)) {
res.status(400).send("All input is required");
}
// Validate if user exist in our database
const user = await User.findOne({ email });

if (user && (await bcrypt.compare(password, user.password))) {
// Create token
const token = jwt.sign(
{ user_id: user._id, email },
process.env.TOKEN_KEY,
{
expiresIn: "2h",
}
);
// save user token
user.token = token;

// user
res.status(200).json(user);
}
res.status(400).send("Invalid Credentials");
} catch (err) {
console.log(err);
}
// Our register logic ends here
});

module.exports = app;
22 changes: 22 additions & 0 deletions jwt-prac/config/database.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
const mongoose = require("mongoose");

const { MONGO_URI } = process.env;

exports.connect = () => {
// Connecting to the database
mongoose
.connect(MONGO_URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true,
useFindAndModify: false,
})
.then(() => {
console.log("Successfully connected to database");
})
.catch((error) => {
console.log("database connection failed. exiting now...");
console.error(error);
process.exit(1);
});
};
11 changes: 11 additions & 0 deletions jwt-prac/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
const http = require("http");
const app = require("./app");
const server = http.createServer(app);

const { API_PORT } = process.env;
const port = process.env.PORT || API_PORT;

// server listening
server.listen(port, () => {
console.log(`Server running on port ${port}`);
});
21 changes: 21 additions & 0 deletions jwt-prac/middleware/auth.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
const jwt = require("jsonwebtoken");

const config = process.env;

const verifyToken = (req, res, next) => {
const token =
req.body.token || req.query.token || req.headers["x-access-token"];

if (!token) {
return res.status(403).send("A token is required for authentication");
}
try {
const decoded = jwt.verify(token, config.TOKEN_KEY);
req.user = decoded;
} catch (err) {
return res.status(401).send("Invalid Token");
}
return next();
};

module.exports = verifyToken;
11 changes: 11 additions & 0 deletions jwt-prac/model/user.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
const mongoose = require("mongoose");

const userSchema = new mongoose.Schema({
first_name: { type: String, default: null },
last_name: { type: String, default: null },
email: { type: String, unique: true },
password: { type: String },
token: { type: String },
});

module.exports = mongoose.model("user", userSchema);
Loading