JWT 하는데...
const express = require("express");
const jwt = require("jsonwebtoken");
const app = express();
app.get("/api", (req, res) => {
res.json({
message: "Welcome to the API",
});
});
app.post("/api/posts", verifyToken, (req, res) => {
jwt.verify(req.token, "secretkey", { expiredsIn: "30s" }, (err, authData) => {
if (err) {
res.sendStatus(403);
} else {
res.json({
message: "Post created...",
authData,
});
}
});
});
app.post("/api/login", (req, res) => {
// Mock user
const user = {
id: 1,
username: "brad",
email: "brad@gmail.com",
};
jwt.sign({ user }, "secretkey", (err, token) => {
res.json({
token,
});
});
});
// Format of token
// Authorizaiton: Bearer <access_token>
// Verify Token
function verifyToken(req, res, next) {
// Get auth header value
const bearerHeader = req.headers["authorization"];
// Check if bearer is undefined
if (typeof bearerHeader !== "undefined") {
// Split at the space
const bearer = bearerHeader.split(" ");
// Get token from array
const bearerToken = bearer[1];
// Set the token
req.token = bearerToken;
// Next middleware
next();
} else {
// Forbidden
res.sendStatus(403);
}
}
app.listen(5000, () => console.log("Server started on port 5000"));
일단 이렇게 이해는 했는데
\\ index.js
const express = require("express");
const app = express();
const dotenv = require("dotenv");
const mongoose = require("mongoose");
// Import Routes
const authRoute = require("./routes/auth");
const postRoute = require("./routes/posts");
dotenv.config();
// Connect to DB
mongoose.connect(
process.env.DB_CONNECT,
{ useNewUrlParser: true, useUnifiedTopology: true },
() => console.log("connected to db!")
);
//Middleware
app.use(express.json());
// Router Middlewares
app.use("/api/user", authRoute);
app.use("/api/posts", postRoute);
app.listen(3000, () => console.log("Server Up and running"));
\\ auth.js
const router = require("express").Router();
const jwt = require("jsonwebtoken");
const User = require("../model/User");
const bcrypt = require("bcryptjs");
router.post("/register", async (req, res) => {
const emailExist = await User.findOne({ email: req.body.email });
if (emailExist) return res.status(400).send("Email already exists");
// Hash password
const salt = await bcrypt.genSalt(10);
const hashedPassword = await bcrypt.hash(req.body.password, salt);
const user = new User({
name: req.body.name,
email: req.body.email,
password: hashedPassword,
});
try {
const savedUser = await user.save();
res.send({ user: user._id });
} catch (err) {
res.status(400).send(err);
}
});
//LOGIN
router.post("/login", async (req, res) => {
//Checking if the email exist
const user = await User.findOne({ email: req.body.email });
if (!user) return res.status(400).send("Email doesn't exist");
//Password is correct
// const validPass = await bcrypt.compare(req.body.password, user.passwords);
// if (!validPass) return res.status(400).send("Invalid password");
// Create and assign a token
const token = jwt.sign({ _id: user._id }, process.env.TOKEN_SECRET);
res.header("auth-token", token).send(token);
});
module.exports = router;
\\ verifytoken.js
const jwt = require("jsonwebtoken");
module.exports = function (req, res, next) {
const token = req.header("auth-token");
if (!token) return res.status(401).send("Access denied");
try {
const verified = jwt.verify(token, process.env.TOKEN_SECRET);
req.user = verified;
next();
} catch (err) {
res.status(400).send("Invalid Token");
}
};