[Firebase] IdToken 유효성 검사하기

스윗포테이토·2023년 1월 19일
1

지난 글에서 세팅한 firebase sdk를 사용해서 클라이언트에서 받은 idToken을 검증해보려고 한다.

우선 클라이언트에서 백엔드로 토큰을 보내는 방법은 여러가지가 있겠지만, HTTP 헤더에 토큰을 포함시키는 Bearer Authentication 방법을 사용하였다.

토큰 정보 읽어오기

let idToken = null;
if (
  req.headers.authorization &&
  req.headers.authorization.startsWith("Bearer ")
) {
  // get token from header
  idToken = req.headers.authorization.split("Bearer ")[1];
}

토큰 검증하기

const { admin } = require("../config/firebase");

admin
  .auth()
  .verifyIdToken(idToken)
  .then((decodedIdToken) => {
  console.log(decodedIdToken);
})

검증 결과는 아래와 같이 나타난다.

따라서 firebase의 uid가 필요한 경우, decodedIdToken.user_id로 조회할 수 있다.

토큰이 유효하지 않으면 error로 이어지고, error.code로 조회하면 결과를 볼 수 있다.

  • auth/id-token-expired: 유효시간이 지난 토큰
  • auth/argument-error: 유효하지 않은 토큰

전체코드

전체 코드는 아래와 같다. 편의를 위해 미들웨어로 선언하였고, 필요한 api에서 가져다 쓰면 된다.

const { admin } = require("../config/firebase");

/**
 * 미들웨어 - 인증이 필요한 api 앞단에서 클라이언트의 토큰 유효성 검사 (firebase)
 */
async function authFirebase(req, res, next) {
  let idToken = null;
  if (
    req.headers.authorization &&
    req.headers.authorization.startsWith("Bearer ")
  ) {
    // get token from header
    idToken = req.headers.authorization.split("Bearer ")[1];
  } else {
    // token not found
    res.status(401).send({
      code: -1,
      message: "can't find token",
    });
    return;
  }

  // verify token
  admin
    .auth()
    .verifyIdToken(idToken)
    .then((decodedIdToken) => {
      res.locals.userId = decodedIdToken.user_id;
      res.locals.email = decodedIdToken.email;
      next(); // 다음 미들웨어로
    })
    .catch((error) => {
      console.log(error.code);

      res.status(401);

      switch (error.code) {
        // expired token
        case "auth/id-token-expired":
          // error handling
          break;
        // invalid token
        case "auth/argument-error":
          // error handling
          break;
      }
    });
}
profile
나의 삽질이 미래의 누군가를 구할 수 있다면...

0개의 댓글