33
loading...
This website collects cookies to deliver better user experience
Authorization: Bearer <JWT Token>
npm i jsonwebtoken
accessToken: { type: String, default: null }
accessToken
field to the model, we are ready to move on. In the "middlewares" folder, create a new file called "generateJWT.js".import jwt from "jsonwebtoken";
import dotenv from "dotenv";
dotenv.config();
const options = {
expiresIn: "24h",
};
async function generateJWT(username) {
try {
const payload = { username };
const token = await jwt.sign(payload, process.env.JWT_SECRET, options);
return { error: false, token };
} catch (error) {
return { error: true };
}
}
export default generateJWT;
JWT_SECRET="<your secret string>"
and add a secret string of your own preference.const { error, token } = await generateJWT(user.username);
if (error) {
return res.status(500).json({
error: true,
message: "Couldn't create access token. Please try again later.",
});
}
user.accessToken = token;
await user.save();
import jwt from "jsonwebtoken";
import dotenv from "dotenv";
dotenv.config();
import User from "../models/user.model.js";
async function validateToken(req, res, next) {
const auhorizationHeader = req.headers.authorization;
let result;
if (!auhorizationHeader) {
return res.status(401).json({
error: true,
message: "Access token is missing",
});
}
const token = req.headers.authorization.split(" ")[1];
const options = {
expiresIn: "24h",
};
try {
let user = await User.findOne({
accessToken: token,
});
if (!user) {
result = {
error: true,
message: "Authorization error",
};
return res.status(403).json(result);
}
result = jwt.verify(token, process.env.JWT_SECRET, options);
if (!user.username === result.username) {
result = {
error: true,
message: "Invalid token",
};
return res.status(401).json(result);
}
req.decoded = result;
next();
} catch (error) {
console.error(error);
if (error.name === "TokenExpiredError") {
return res.status(403).json({
error: true,
message: "Token expired",
});
}
return res.status(403).json({
error: true,
message: "Authentication error",
});
}
}
export default validateToken;
async logout(req, res) {
try {
const { username } = req.decoded;
let user = await User.findOne({ username });
user.accessToken = "";
await user.save();
return res.status(200).json({
success: true,
message: "User logged out",
});
} catch (error) {
console.error(error);
return res.status(500).json({
error: true,
message: error,
});
}
}
usersRouter.js
file should look like that:import express from "express";
import UsersController from "../controllers/UsersController.js";
const usersRouter = express.Router();
import cleanBody from "../middlewares/cleanBody.js";
import validateToken from "../middlewares/validateToken.js";
const users = new UsersController();
usersRouter.post("/signup", cleanBody, users.signup);
usersRouter.patch("/login", cleanBody, users.login);
usersRouter.patch("/logout", validateToken, users.logout);
export default usersRouter;