πŸ“¦ SeolJaeHyeok / My-shopping-mall

πŸ“„ login-required.js Β· 53 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53import jwt from "jsonwebtoken";

function loginRequired(req, res, next) {
  // request ν—€λ”λ‘œλΆ€ν„° authorization bearer 토큰을 λ°›μŒ.
  // token format 확인
  const wholeToken = req.headers["authorization"]?.split(" ");
  const tokenFormat = wholeToken[0];
  if (tokenFormat !== "Bearer") {
    console.log("Bearer 토큰이 μ•„λ‹™λ‹ˆλ‹€.");
    res.status(401).json({
      result: "Unauthorized-approach",
      reason: "μ§€μ›λ˜μ§€ μ•ŠλŠ” 토큰 ν¬λ§·μž…λ‹ˆλ‹€.",
    });
  }

  const userToken = wholeToken[1];
  // 이 토큰은 jwt 토큰 λ¬Έμžμ—΄μ΄κ±°λ‚˜, ν˜Ήμ€ "null" λ¬Έμžμ—΄μ΄κ±°λ‚˜, undefinedμž„.
  // 토큰이 "null" 일 경우, login_required κ°€ ν•„μš”ν•œ μ„œλΉ„μŠ€ μ‚¬μš©μ„ μ œν•œν•¨.
  if (!userToken || userToken === "null") {
    console.log("μ„œλΉ„μŠ€ μ‚¬μš© μš”μ²­μ΄ μžˆμŠ΅λ‹ˆλ‹€.ν•˜μ§€λ§Œ, Authorization 토큰: μ—†μŒ");
    res.status(401).json({
      result: "Unauthorized-approach",
      reason: "λ‘œκ·ΈμΈν•œ μœ μ €λ§Œ μ‚¬μš©ν•  수 μžˆλŠ” μ„œλΉ„μŠ€μž…λ‹ˆλ‹€.",
    });

    return;
  }

  // ν•΄λ‹Ή token 이 정상적인 token인지 확인
  try {
    const secretKey = process.env.JWT_SECRET_KEY || "secret-key";
    const jwtDecoded = jwt.verify(userToken, secretKey);

    const userId = jwtDecoded.userId;

    // λΌμš°ν„°μ—μ„œ req.currentUserIdλ₯Ό 톡해 μœ μ €μ˜ id에 μ ‘κ·Ό κ°€λŠ₯ν•˜κ²Œ 됨
    req.currentUserId = userId;

    next();
  } catch (error) {
    // jwt.verify ν•¨μˆ˜κ°€ μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€λŠ” κ²½μš°λŠ” 토큰이 μ •μƒμ μœΌλ‘œ decode μ•ˆλ˜μ—ˆμ„ κ²½μš°μž„.
    // 403 μ½”λ“œλ‘œ JSON ν˜•νƒœλ‘œ ν”„λ‘ νŠΈμ— 전달함.
    res.status(401).json({
      result: "Unauthorized-approach",
      reason: "정상적인 토큰이 μ•„λ‹™λ‹ˆλ‹€.",
    });

    return;
  }
}

export { loginRequired };