nodejs에 token 적용하기 - 2. 미들웨어 설정하기

·2021년 11월 29일
2

서버

목록 보기
2/5

이번에는 아까 만든 토큰을 통해 사용자를 식별하는 걸 해 보자.

아래 웹사이트들을 참고했다.
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에 임의의 값 넣기

src/app.ts

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);
        });
});

src/middlewares/auth.ts

굳이 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" });
    }
};

src/customType/express.d.ts

Request 자체에 user이라는 게 없어서, 미들웨어를 통해 user를 넘기기가 마땅치 않았는데,
아래와 같은 방법으로 넘길 수 있게 되었다.

import User from "../models/user.model";

declare global {
    namespace Express {
        interface Request {
            user?: User;
        }
    }
}

tsconfig.json

물론 tsconfig를 또 수정해 줘야 한다.

// ....
"typeRoots": [
            "./node_modules/@types",
            "./src/customType"
        ] /* Specify multiple folders that act like `./node_modules/@types`. */,
// ....
profile
이것저것 개발하는 것 좋아하지만 서버 개발이 제일 좋더라구요..

0개의 댓글