
full code
https://github.com/suminllll/chatting-sample
const jwtSecret = process.env.JWT_SECRET;
const jwt = require("jsonwebtoken");
const jwtConstants = {
expiresIn: "7 days",
expires: () => {
const days =
parseInt(jwtConstants.expiresIn.split(" ")[0]);
return new Date(Date.now() + 1000 * 60 * 60 * 24 * days);
},
};
function jwtSeriallzer(req, res, next) {
const token = jwt.sign(
{ nick: req.body.nick,}, jwtSecret,
{ expiresIn: jwtConstants.expiresIn,});
res.cookie("accessToken", token, {
httpOnly: true,
signed: true,
secret: jwtSecret,
expires: jwtConstants.expires(),
});
next();
}
async function jwtDeserializer(req, res, next) {
const accessToken = req.signedCookies.accessToken;
if (!accessToken) {
return res.status(401).send({
result: false,
message: "Access token is not provided",
data: [],
});
}
const decoded = jwt.verify(accessToken, jwtSecret);
const isExpired = decoded.exp < Date.now() / 1000;
if (isExpired) {
return res.status(401).send({
result: false,
message: "Access token is expired",
data: [],
});
}
req.user = { nick: decoded.nick };
res.locals.message = "Access token is valid";
next();
}
module.exports = { generateToken, jwtDeserializer };
발급하기
const express = require("express");
const router = express.Router();
const loginCtr = require("../controller/login");
const { jwtSerializer, jwtDeserializer } = require("../commons/jwt");
router.post("/add", jwtSerializer, async function (req, res, next) {
const reqData = {
nick: req.body.nick,
};
const getMemberFromNick = await loginCtr.getLogin(reqData);
if (getMemberFromNick.success) {
return res.status(getMemberFromNick.http_status).send(getMemberFromNick);
}
const resData = await loginCtr.addLogin(reqData);
return res.status(resData.http_status).send(resData);
});
const loginCtr = {};
loginCtr.addLogin = async (_reqData) => {
let inputSql, outputSql;
inputSql = `INSERT INTO member(nick, joined) VALUES(:nick, now())`;
outputSql = await _db.qry(inputSql, _reqData);
if (!outputSql.success) return _res.internalServerErr();
return _res.created(outputSql.result.insertId);
};
조회하기
router.get("/info", jwtDeserializer, async (req, res) => {
const reqData = {
nick: req.user.nick,
};
const resData = await loginCtr.getLogin(reqData);
return res.status(resData.http_status).send(resData);
});
const loginCtr = {};
loginCtr.getLogin = async (_reqData) => {
let inputSql, outputSql;
inputSql = `SELECT * FROM member WHERE nick = :nick`;
outputSql = await _db.qry(inputSql, _reqData);
if (!outputSql.success) return _res.internalServerErr();
console.log(outputSql);
return _res.okData(outputSql.result);
};
로그아웃
router.post("/logout", async (req, res) => {
return res.clearCookie("accessToken").status(200).send({});
});