• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 React 게시판 선생님 카카오 로그인 구현 질문있습니다.

선생님 카카오 로그인 구현 질문있습니다.

5 글 보임 - 1 에서 5 까지 (총 5 중에서)
  • 글쓴이
  • #93695

    정중식
    참가자
    리액트 , nodejs,mongodb사용중입니다.
    
    클라이언트에서 버튼을누르면 아래 컴포넌트를 발동시키는데요,
     <SocialKakao />
    
    이 컴포넌트 코드는 이렇습니다.
    
    
    const SocialKakao = () => {
      const REST_API_KEY = process.env.REACT_APP_KAKAO_ID;
      const REDIRECT_URI = 'http://localhost:3000/auth/kakao/callback';
      // oauth 요청 URL
      const KAKAOURL = `https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code`;
      const onLogin = () => {
        window.location.href = KAKAOURL;
      };
      return (
        <>
          <KakaoButton onClick={onLogin}>
            <RiKakaoTalkFill size={29} /> &nbsp;카카오계정으로 회원가입
          </KakaoButton>
        </>
      );
    };
     
    그리고 여기서 카카오톡 인증 뭐 어쩌구 로그인 페이지는 잘떠서 확인누르고 하면 code를 발급받는 url이 뜨는데요,
    http://localhost:3000/auth/kakao/callback?code=E1V9JaV1w64BdmjRFLACDW5fz9hwGgVn7KXLX-8scpgXZl8iEs2FfIwJssUEn1_tFD64DQo9dRkAAAGJzCI4XA
    이런 페이지로 가게되는데 여기서 어떻게해야되나요?
    일단은 /auth/kakao/callback 경로의 컴포넌트를 만들어줘서 에러는 안뜹니다.
    
    /auth/kakao/callback 경로의 컴포넌트 코드구조는 이렇습니다.
    
    import axios from 'axios';
    import React, { useEffect } from 'react';
    const KakaoCallBack = () => {
        useEffect(() => {
          const params = new URL(document.location.toString()).searchParams;
          const code = params.get('code');
          const grant_type = 'authorization_code';
          const client_id = `${process.env.REACT_APP_KAKAO_ID}`;
          const REDIRECT_URI = '/api/auth/kakao/callback';
          axios
            .post(
              `https://kauth.kakao.com/oauth/token?grant_type=${grant_type}&client_id=${client_id}&redirect_uri=${REDIRECT_URI}&code=${code}`,
              {},
              {
                headers: {
                  'Content-type': 'application/x-www-form-urlencoded;charset=utf-8',
                },
              }
            )
            .then((res) => {
              console.log(res);
            });
        }, []);
      return <div>KakaoCallBack</div>;
    };
    export default KakaoCallBack;
    근데 useEffect이거 주석처리안해주면 Request failed with status code 400 AxiosError: Request failed with status code 400 at settle (http://localhost:3000/static/js/bundle.js:133539:12) at XMLHttpRequest.onloadend (http://localhost:3000/static/js/bundle.js:132230:66)
    이런 에러가발생하네요
    
    
    지금 너무 헤매고있어서 너무 힘드네요..
    처음에는 passport 로컬방식을쓰고있어서 passport-kakao를 설치해서 서버쪽에서 하고,
    클라이언트쪽에서는 a태그걸고 href='/auth/kakao/' 이렇게만해줬었는데 회원가입,로그인 처리가 안되고 빈페이지만뜨길래
    지금과같은 방식으로 클라이언트는 수정해줫는데요,
    
    서버쪽코드는 인터넷 검색검색해서 이런식으로 구현해봤습니다. 
    
    - 경로
    app.use('/api/auth', require('./routes/api/auth'));
     
    - 미들웨어
    passport.use(
      new KakaoStrategy(
        {
          clientID: process.env.KAKAO_ID,
          callbackURL: '/auth/kakao/callback',
        },
        async (accessToken, refreshToken, profile, done) => {
          console.log(accessToken, profile);
          try {
            // 사용자의 정보는 profile에 들어있다.
            const exUser = await User.findOne({
              where: { snsId: profile.id, provider: 'kakao' },
            });
            if (exUser) {
              // 로그인 성공
              done(null, exUser);
            } else {
              // 가입 이력없으면 회원가입시키고 로그인 성공
              const newUser = await user.create({
                email: profile._json && profile._json.kaccount_email,
                nick: profile.displayName,
                snsId: profile.id,
                provider: 'kakao',
              });
              done(null, newUser);
            }
          } catch (error) {
            done(error);
          }
        }
      )
     
    - 라우터
    
    /** kakao login */
    router.get('/kakao', passport.authenticate('kakao'));
    router.get(
      '/kakao/callback',
      passport.authenticate('kakao', {
        failureRedirect: '/',
      }),
      (req, res) => {
        console.log('res', res);
        res.redirect('/');
      }
    );
    
    이렇게해줬는데..
    카카오톡 클라이언트에서 지금처럼 코드를 구현했으면 제가 passport-kakao로 구현한 서버쪽 코드가 필요한가요??
    
    
    
     
    
    #93728

    codingapple
    키 마스터
    아마 ?code= 뒤에있는 코드를 서버로 보내서 서버는 그걸로 토큰발급받아오거나 그래야할걸요 
    인터넷에 예제많을텐데 따라하는게 빠릅니다
    #93834

    정중식
    참가자
    선생님 안녕하세요 정말 질문 알잘딱깔센 하게 해서 다시 찾아뵙게되었습니다.
    
    제가 혼란스러워하고있는 부분은
    
    passport-kakao로 서버쪽에서구현하고있는데, 그러면 프론트에서는 어떤식으로 백엔드에 요청을해서 카카오로그인을 구현해야하는가? 입니다.
    
     passport-kakao로 구현한 예제들을 봤는데, 이런식으로만 해주고있습니다.
    참고코드
     
    백엔드 경로가 예를들면 ( /api/auth/kakao)
    router.get('/kakao', passport.authenticate('kakao')); 이렇다면, 
    
    프론트에서는 이런식으로만 해주고있습니다.
        
          < img src='/images/kakao_login_btn.png' alt='' />
        
    
    근데 이렇게 그대로 따라하면 카카오로그인페이지 안뜨고 에러 혹은 말그대로 /api/auth/kakao 라우트 경로의 페이지만 뜨게됩니다. (빈페이지)
    
    그래서 썜이 말씀하신것처럼 이런식으로하게되면
    
    프론트에서 클릭 하면 리다이렉트 페이지로가게됨
    
    - 카카오톡 로그인버튼 컴포넌트
      const REST_API_KEY = process.env.REACT_APP_REST_API;
      const REDIRECT_URI = 'http://localhost:3000/auth/kakao/callback';
      const KAKAO_AUTH_URL = `https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code`;  
    
     
          < img src='/images/kakao_login_btn.png' alt='' />
        
    
    - 카카오톡 콜백 컴포넌트
    
    
    useEffect(() => {
        const fetchData = async () => {
          const CODE = new URL(window.location.href).searchParams.get('code');
          const GRANT_TYPE = 'authorization_code';
          const CLIENT_ID = `${process.env.REACT_APP_REST_API}`;
          const REDIRECT_URI = 'http://localhost:3000/auth/kakao/callback';
          try {
            const res = await axios.post(
              `https://kauth.kakao.com/oauth/token?grant_type=${GRANT_TYPE}&client_id=${CLIENT_ID}&redirect_uri=${REDIRECT_URI}&code=${CODE}`,
              {},
              {
                headers: {
                  'Content-type': 'application/x-www-form-urlencoded;charset=utf-8',
                },
              }
            );
            console.log(res);
          } catch (error) {
            console.log(error);
          }
        };
        fetchData();
      }, []);
      return <div>KakaoCallBack</div>;
    
    콘솔로그 찍어보면 (res)에 유저 토큰이 잘 찍힙니다.
    
    그럼 이제 이거를 콜백컴포넌트에서 서버쪽에 토큰을보내서 처리해주면되는데.. 혹은
    프론트에서 토큰을 받지말고,
    code= 뒤에있는 코드를 body에 담아서 서버쪽에 보내고 서버쪽에서 토큰을 발급받고, 뭐 어쩌구해주면되는데..
    
    여기서 또 혼란스럽습니다.
    
    1. 그러면 passport-kakao전략은 쓸모없는거아닌지
    
    2. 기존에 passport 로컬을 쓰고있고, 이 전략을통해서 기존 회원들의 토큰값을 판단해서 사용자 인증처리 (로그인유무)를 해주고있는데 
       소셜로그인같은경우 어떤식으로 인증처리를해줘야하는지가 궁금합니다..
    
    좀 혼란스러워서 질문이 깔끔하지못한거같은데 죄송합니다 ㅠㅠ
    
    
    #93889

    codingapple
    키 마스터
    passport-kakao 쓰면 쉬워보입니다 
    https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-Passport-%EA%B5%AC%ED%98%84
    이런거 따라합시다 
    
    https://kakao-tam.tistory.com/65
    이건 jwt 사용시같군요 
    
    로그인완료되면 아무데서나 요청.user 쓰면 유저정보 알아서 나옵니다
    #94001

    정중식
    참가자
    감사합니다!
5 글 보임 - 1 에서 5 까지 (총 5 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠