250213 포트폴리오 프로젝트(30)

geenee·2025년 2월 13일
0

Portfolio

목록 보기
36/38
post-thumbnail

소셜 로그인(카카오)

카카오 로그인으로 토큰과 사용자 정보를 받아왔으니 이후 로직을 추가해줘야한다

user 테이블 속성 추가

소셜로그인인지 로컬로그인인지 구분하기 위해 mem_type 속성 추가
로컬로그인 시 필수 속성 : 아이디, 비밀번호, 이름, 이메일, 닉네임
개발자 모드에서는 카카오 필수 속성 : 닉네임 선택동의 : 이메일
아이디,비밀번호,닉네임은 임의 값 저장
이름,이메일은 필수 속성이라고 생각하고 이름은 임의 글자 저장, 이메일은 받은대로 저장

router.get("/kakaologin", async (req, res) => {
  const code = req.query.code;
  const KAKAO_OAUTH_TOKEN_API_URL = "https://kauth.kakao.com/oauth/token";
  const KAKAO_GRANT_TYPE = "authorization_code";
  const KAKAO_CLIENT_id = process.env.REACT_APP_KAKAO_RESTAPI_KEY;
  const KAKAO_REDIRECT_URL = process.env.REACT_APP_KAKAO_REDIRECT_URI;

  try {
    // 카카오 로그인 유저 토큰 요청
    const response = await axios.post(
      `${KAKAO_OAUTH_TOKEN_API_URL}?grant_type=${KAKAO_GRANT_TYPE}&client_id=${KAKAO_CLIENT_id}&redirect_uri=${KAKAO_REDIRECT_URL}&code=${code}`,
      {
        headers: {
          "Content-type": "application/x-www-form-urlencoded;charset=utf-8",
        },
      }
    );

    const access_token = response.data.access_token;
    const refresh_token = response.data.refresh_token;

    // 카카오 사용자 정보 요청
    const userinfo = await axios.get(`https://kapi.kakao.com/v2/user/me`, {
      headers: {
        Authorization: `Bearer ${access_token}`,
      },
    });

    const user_email = userinfo.data.kakao_account.email;
    const user_nickname = String(userinfo.data.properties.nickname).slice(0, 5);
    //랜덤 코드 생성(7자리)
    let randomcode = String(Math.floor(Math.random() * 10000000)).padStart(
      7,
      "0"
    );

    // 유저 DB 조회
    let selectresult = await DB.runDB(
      `SELECT * FROM user WHERE mem_email = '${user_email}' AND mem_status = 'Y' AND mem_type = 'social_kakao'`
    );

    if (selectresult.length === 0) {
      // 유저 DB 추가
      const insertresult = await DB.runDB(
        `INSERT INTO user(mem_userid,mem_password,mem_username,mem_email,mem_nickname,mem_phone,mem_regtime,mem_type) VALUES ('kakao${randomcode}','','카카오','${user_email}','${user_nickname}','',NOW(),'social_kakao')`
      );
      // 유저 다시 조회
      selectresult = await DB.runDB(
        `SELECT * FROM user WHERE mem_email = '${user_email}' AND mem_status = 'Y' AND mem_type = 'social_kakao'`
      );
    }

    /**
     * 로그인 세션 저장
     */
    req.session.is_logined = true;
    req.session.idx = selectresult[0].mem_idx;
    req.session.type = selectresult[0].mem_type;
    req.session.access_token = access_token;
    req.session.refresh_token = refresh_token;
    req.session.save();

    // 메인 페이지로 이동
    res.redirect("http://localhost:3000/");
  } catch (e) {
    console.log(e);
    res.send(e);
  }
});

로그인 요청 부분에서는 이렇게 처리했다!

  1. 토큰 요청 > 사용자 정보 요청
  2. 사용자 정보로 DB 조회
  3. 사용자 정보가 없는 경우 DB에 추가
  4. nodejs session에 필요한 값 저장
router.get("/logout", async (req, res) => {
  if (req.session.type === "social_kakao") {
    axios({
      method: "POST",
      url: "https://kapi.kakao.com/v1/user/logout",
      headers: {
        "Content-Type": "application/x-www-form-urlencoded",
        Authorization: `Bearer ${req.session.access_token}`,
      },
    })
      .then(() => {})
      .catch((e) => {
        // 이미 만료된 토큰일 경우
        if (e.response.data.code === -401) {
          console.log(e);
        }
      });
  }

  req.session.destroy();
  res.send({ isLogin: false });
});

[React] 카카오 로그인/로그아웃 프론트에서 다 하기 (+ 서비스 회원가입/로그인/로그아웃 포함)
로그아웃 부분은 구글링해서 적용해보았다..ㅎㅎ
토큰을 발급 받으니 당연히 유효기간이 있을테고 토큰 재발급은 어떻게 해야하는지 찾아봐야겠음

meme_type 조건을 걸어줘야 하는 쿼리에도 전부 수정을 해주었다!

그리고 마이페이지에서 카카오 로그인 시 수정할 수 없는 부분은 조건을 줘서 버튼 처리함

사이트 회원가입 시 마이페이지


카카오 로그인 시 비밀번호 변경, 이메일 수정 버튼이 없어짐

로그인 후 사용할 수 있는 기능들이 제대로 되는지 전부 확인해보고 마무리!

profile
코딩 공부 기록용

0개의 댓글