클라우드 어플리케이션 엔지니어링 TIL(API-2)

김상우·2024년 4월 5일

토큰

	return res.status(400).json({
    accessToekn: await new jose.SignJWT({ user_id: user.id })
      .setProtectedHeader({ alg: "HS256" })
      .setIssuedAt()
      .setExpirationTime("1h")
      .sign(secret),
  });
});

retun res 문을 통해 토큰에 필요한 옵션을 지정하고 생성

결과 :
토큰 생성 확인

토큰 미들웨어화

import * as jose from "jose";
import { secret } from "../core/auth.js";
export default async function (req, res, next) {
  const authHeader = req.headers.authorization;
  try {
    const token = authHeader.split(" ")[1];
    await jose.jwtVerify(token, secret);
    console.log(verfiedToken);
  } catch (error) {
    return res.status(401).json({
      message: "토큰 인증에 실패했습니다.",
    });
  }
  next();
}


토큰 넘겨주기로 인증 성공(Authorization 사용 시 소문자로 쓸 것)

토큰 미들웨어화 인증

router.patch("/:userId", authMiddleware, (req, res) => {
  const { userId } = req.params;
  const userIndex = db.data.users.findIndex(({ id }) => id === userId);
  if (userIndex < 0) {
    return res.status(404).json({
      _links: {
        users: {
          href: req.baseUrl,
        },
      },
      messaage: "조회하려는 유저가 존재하지 않습니다",
      error: "Not Found",
    });
  }
  if (req.auth.user_id !== userId) {
    return res.status(403).json({
      message: "올바르지 않은 접근입니다.",
    });
  }
  const { error, value } = userPartialUpdateSchema.validate(req.body);
  if (error) {
    return res.status(400).json({
      messaage: error.details[0].message,
    });
  }
  const user = db.data.users[userIndex];
  for (const key of Object.keys(req.body)) {
    user[key] = value[key];
  }
  db.data.users[userIndex] = user;
  db.write();
  const { value: userResponseData } = userResponseSchema.validate(user, {
    stripUnknown: true,
  });
  res.status(200).json({
    _embedded: {
      user: {
        links: {
          self: {
            href: `${req.originalUrl}`,
          },
        },
        ...userResponseData,
      },
    },
  });
});

토큰 내부의 데이터를 가져와 해당 데이터를 요청과 검증함으로써 해당 토큰을 가진 유저가 올바르게 접근했는지 확인한다.

profile
개발 초보

0개의 댓글