mingg IT

[React+Typescript] Sns 로그인 (KaKao) 구현예시 본문

FrontEnd

[React+Typescript] Sns 로그인 (KaKao) 구현예시

mingg123 2023. 1. 13. 17:47

정말 많은 글을 읽었고, 사람마다 여러 방법이 있었으나 내가 사용한 방법을 공유하고자 한다. 

 

1. 우선 카카오톡 api 를 사용해야하기 때문에 계정을 만들고 내 어플리케이션에서 추가한다. 

https://developers.kakao.com/console/app

 

카카오계정

 

accounts.kakao.com

2. 요약정보 > 앱 키를 보면 내가 api를 호출할때 사용할 키 이다. 

 

3. 카카오 로그인 > 활성화 상태를 ON으로 만든다. 

4. Redirect URI 를 입력한다. 난 개발중이기 때문에 임의로 localhost:4220~ 로 적었다. 

 

5. index.html에 추가해준다. (안해주면 나중에 kakao.auth를 쓸때 에러난다.)

<script src="https://developers.kakao.com/sdk/js/kakao.js"></script>

 

6. 이제 부터 시작. 아까 보았던 API 키와, 적어주었던 Redirect URI 를 사용해준다.

home.tsx

const login = () => {
  return (
    <button onClick={() =>
      location.href = 'https://kauth.kakao.com/oauth/authorize?client_id=${KAKAO_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code'
    }>카카오톡 로그인</button>
  )
}

7.  버튼을 클릭하면 이렇게 카카오톡 로그인 하는 창이 뜰 것이다.  

해당 화면이 뜨지않고 바로 7처럼 redirect page로 갈 경우에는 쿠키를 지우거나, 브라우저에서 카카오톡 로그인이 되어잇는것들을 전부 로그아웃 해봐라. 그러면 뜰것이다. 

 

8. 아이디와 비밀번호를 입력후, 로그인을 누르면 내가 입력해두었던 redirec url 로 이동한 것을 확인할 수 있다. 

 

확인해보면 redirectUri 뒤에 code= 어쩌고저쩌고가 있다. 이게 바로 내가 활용할 정보이다.

 

아참 이때 redirect Uri로 내가 라우팅한 컴포넌트가 만들어져 있어야 한다.

<Route path="/redirectsns" element={<RedirectPage />} />

이런식으로 있어야 한다. 

 

8. code 값을 이용하여 accessToken과, 유저 정보를 읽어오면된다.

RedirectPage.tsx 

import { Paper } from '@mui/material';
import axios from 'axios';
import { useEffect } from 'react';
import { SignAgreeFirstPage } from '../SignPage/SignAgreeFirstPage';
import qs from "qs";
import { KAKAO_API_KEY, REDIRECT_URI } from 'libs/apis/vaunce/src/VaunceAppApis/const';
import { useAtomValue, useSetAtom } from 'jotai';
import { VaunceState } from '@kinderlabs-pos/state';

export interface IRedirectSnsPageProps { }
export const RedirectSnsPage: React.FC<IRedirectSnsPageProps> = ({ }) => {

  const code = new URL(window.location.href).searchParams.get("code");

  if (code) {
    localStorage.setItem('code', code);
  }
  const getKaKaoToken = async () => {
    const { Kakao } = window as any

    const payload = qs.stringify({
      grant_type: "authorization_code",
      client_id: KAKAO_API_KEY,
      redirect_uri: REDIRECT_URI,
      code: code,
    });
    try {
      const res = await axios.post(
        "https://kauth.kakao.com/oauth/token",
        payload
      );

      // Kakao Javascript SDK 초기화
      Kakao.init(KAKAO_API_KEY);
      // access token 설정

      Kakao.Auth.setAccessToken(res.data.access_token);
      localStorage.setItem('accessToken', res.data.access_token);
      localStorage.setItem('Provider', "KAKAO");

      console.log('accessToken:', res.data.access_token)

      let data = await Kakao.API.request({
        url: "/v2/user/me",
      });
      if (data) {
        console.log('data', data)
      }


    } catch (err) {
      console.log(err);
    }
  };

  useEffect(() => {
    getKaKaoToken();

  }, [])

  return (
    // <button onClick={handle인증요청하기}>본인인증어쩌고</button>
    <SignAgreeFirstPage />
  )
};

 

accessToken 값도 정상적으로 만들어졌고, 해당 토큰값으로 내 정보도 읽어온 것을 알 수 있다.

 

네이버 같은 경우에는 프론트에서 토큰값이나, 프로필을 읽어오는 api를 호출하면

cors 에러가 나서 결국 토큰, 프로필 읽어오는 부분은 서버에서 호출하도록 변경하였다. (흑흑)

 

 

AccessToken을 받는 부분 API 문서 

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

Comments