이번에는 아까 만든 토큰을 통해 사용자를 식별하는 걸 해 보자.
아래 웹사이트들을 참고했다.
How to Build an Authentication API with JWT Token in Node.js
Markdown-Archive/jwt-guide(2).md at master · leejh3224/Markdown-Archive
TypeScript Express #4. Registering & authenticating with JWT - wanago.io
express와 Typescript 사용 중 req에 임의의 값 넣기
import * as dotenv from "dotenv";
import express, { Response, Request, NextFunction } from "express";
import cors from "cors";
import indexRouter from "./routes";
import { verifyToken } from "./middlewares/auth";
dotenv.config();
// * APP VARIABLES
const PORT: number = parseInt(process.env.PORT as string, 10) || 5000;
const HOST: string = process.env.HOST || "localhost";
const app: express.Application = express();
// * APP CONFIGURATION: middleware
app.use(cors());
app.use(express.json());
app.get("/test", verifyToken, (req: Request, res: Response) => {
// email password nickname rasp_token android_token
console.log(req.user?.id);
res.status(200).send({ done: true });
// res.status(400).send({ done: false });
});
// 5000 포트로 서버 실행
app.listen(PORT, HOST, async () => {
console.log(`server on: listening on ${HOST}:${PORT}`);
// sequelize-db connection test
await sequelize
.sync({})
.then(async () => {
console.log("seq connection success");
})
.catch((e) => {
console.log("seq ERROR: ", e);
});
});
굳이 decodedData를 이용한 이유는 형변환 때문이었다.
import jwt from "jsonwebtoken";
import { Response, Request, NextFunction } from "express";
import User from "../models/user.model";
interface decodedData extends Object {
email: string;
}
export const verifyToken = async (
req: Request,
res: Response,
next: NextFunction
) => {
const token =
req.body.token || req.query.token || req.headers["x-access-token"];
if (!token) {
return res.status(403).send({
status: 403,
message: "A token is required for authentication",
});
}
try {
const TOKEN_KEY = process.env.TOKEN_KEY || "";
const { email } = jwt.verify(token, TOKEN_KEY) as decodedData;
let user;
console.log("hello");
await User.findOne({ where: { email: email } })
.then((data) => {
user = data;
})
.catch((e) => {
throw e;
});
if (user) {
req.user = user;
next();
} else {
return res
.status(401)
.send({ status: 401, message: "Invalid token" });
}
} catch (e) {
console.log(e);
return res.status(401).send({ status: 401, message: "Invalid token" });
}
};
Request 자체에 user이라는 게 없어서, 미들웨어를 통해 user를 넘기기가 마땅치 않았는데,
아래와 같은 방법으로 넘길 수 있게 되었다.
import User from "../models/user.model";
declare global {
namespace Express {
interface Request {
user?: User;
}
}
}
물론 tsconfig를 또 수정해 줘야 한다.
// ....
"typeRoots": [
"./node_modules/@types",
"./src/customType"
] /* Specify multiple folders that act like `./node_modules/@types`. */,
// ....