프론트앤드/[React]

[React] 카카오 API 연결 로그인

헬리이 2023. 2. 28. 16:54
728x90

 

 

참고한 카카오 개발자 페이지 

https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api#additional-feature

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

//KakaoAPI.js

import React, { useEffect } from 'react';
import { useNavigate, useLocation } from 'react-router-dom';
import { REST_API_KEY, REDIRECT_URI } from '../../config';

const KakaoAPI = () => {
  const location = useLocation();
  const navigate = useNavigate();
  const KAKAO_CODE = location.search.split('=')[1];

  console.log(location);

  const getKakaoToken = () => {
    fetch('https://kauth.kakao.com/oauth/token', {
      method: 'POST',
      headers: {
        'Content-type': 'application/x-www-form-urlencoded',
      },
      body: `grant_type=authorization_code&client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&code=${KAKAO_CODE}`,
    })
      .then(res => res.json())
      .then(data => {
        console.log(data);
        if (data.access_token) {
          postToken(data.access_token);
        } else {
          alert('다시 로그인 해주세요!');
          navigate('/login');
        }
      });
  };

  const postToken = token => {
    fetch('http://10.58.52.121:3000/users/login', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json;charset=utf-8',
        authorization: token,
      },
    })
      .then(res => res.json())
      .then(data => {
        if (data.accessToken) {
          localStorage.setItem('token', data.accessToken);
          navigate('/');
        } else {
          alert('다시 로그인 해주세요!');
          navigate('/login');
        }
      });
  };

  useEffect(() => {
    if (!location.search) return;
    getKakaoToken();
  }, [location.search]);

  return <div>KakaoAPI 로딩중 해보기</div>;
};

export default KakaoAPI;
//config.js

export const REDIRECT_URI = `http://localhost:3000/users/login`;
export const REST_API_KEY = 비밀

 


정리해보기

첫 번째 fetch 에서

const KakaoAPI = () => {
  const location = useLocation();
  const navigate = useNavigate();
  const KAKAO_CODE = location.search.split('=')[1];


  const getKakaoToken = () => {
    fetch('https://kauth.kakao.com/oauth/token', {
      method: 'POST',
      headers: {
        'Content-type': 'application/x-www-form-urlencoded',
      },
      body: `grant_type=authorization_code&client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&code=${KAKAO_CODE}`,
    })
      .then(res => res.json())
      .then(data => {
        console.log(data);
        if (data.access_token) {
          postToken(data.access_token);
        } else {
          alert('다시 로그인 해주세요!');
          navigate('/login');
        }
      });
  };

 

1. 인가코드 요청 및 받기

GET /oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code HTTP/1.1
Host: kauth.kakao.com

 

인가코드 받은것 useLocation 을 이용해서 KAKAO_CODE 에 받아줌

const KAKAO_CODE = location.search.split('=')[1];

 

console.log(location);

KAKAO_CODE : 위에 그림처럼 location안의 search 에 나온 인가코드 에서 '=' 뒤의 코드 모드 가져오는 코드

 

 

2. 토큰받기

 

POST /oauth/token HTTP/1.1
Host: kauth.kakao.com
Content-type: application/x-www-form-urlencoded;charset=utf-8
if (data.access_token) {
          postToken(data.access_token);
        } else {
          alert('다시 로그인 해주세요!');
          navigate('/login');

data를 받았을때, data.access_token 이 있으면, postToken 함수 발동

아니면, '다시 로그인 해주세요!' 라는 메세지와 함께 /login 페이지로 이동 

 

 

console.log(data)했을때, 

data 안의 access_token 을 가져온 것이다. 

 

이런식으로 모를땐 꼭 console.log 찍어보기!! 

 

두번째 fetch 는 위에서 access_token 이 있을때  발생되는 postToken 함수에 관한 것이다.

const postToken = token => {
    fetch('http://10.58.52.121:3000/users/login', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json;charset=utf-8',
        authorization: token,
      },
    })
      .then(res => res.json())
      .then(data => {
        if (data.accessToken) {
          localStorage.setItem('token', data.accessToken);
          navigate('/');
        } else {
          alert('다시 로그인 해주세요!');
          navigate('/login');
        }
      });
  };

두 번 째fetch는 

fetch 하는 주소를  backend에서 access_token 을 받고, 

그 토큰을 가지고 카카오서버에서 유저에 관한 정보를 들고와서 프로젝트 사이트에서 쓰일 토큰으로 바꿔서 프론트로 다시 줄 예정!

 

** 이때, fetch 주소를 기입할때 꼭 https <<<< 안쓰도록 꼭주의... 

저는 https 를 썼다가 프로토콜 에러 계속 났었습니당.. ㅠ_ㅠ 

 

 

method 도 백엔드에서 설정한 값을 적어주고, 

localStorage에 setItem 으로 key, value를 token 과 data.accessToken 으로 설정한다. 

**이때, key와 value는 백엔드에서 설정해 준 값으로 했다. 

 

 

 

참고용

localStorage란?

localStorage를 사용하면, 브라우저에 key-value 값을 Storage에 저장할 수 있는데, 

저장한 데이터는 세션간에 공유되고, 세션이 바뀌어도 저장한 데이터가 유지된다. 

 

  • setItem() - key, value 추가
  • getItem() - value 읽어 오기
  • removeItem() - item 삭제
  • clear() - 도메인 내의 localStorage 값 삭제
  • length - 전체 item 갯수
  • key() - index로 key값 찾기

 

 

일단은 여기까지... 

728x90