본문 바로가기
JavaScript/React

[React,두둥] 카카오톡 로그인 (1)

by @김상현 2021. 3. 18.
반응형

카카오톡을 통해 사용자 정보를 받아오고

이를 파이어베이스를 통해 가입 및 로그인을 구현하자.

1. Kakao Developers 에 가입을 한 후 어플리케이션을 추가하자.

2. root/public/index.html

<!DOCTYPE html>
<html lang="en">
  <head>
      ...
    <!-- Add Here for Kakao SDK-->
    <script src="https://developers.kakao.com/sdk/js/kakao.js"></script>
    <script>
      Kakao.init('JAVASCRIPT_KEY')
      console.log(Kakao.isInitialized())
    </script>
  </head>
  <body>
      ...
    <div id="root"></div>
  </body>
</html>

JAVASCRIPT_KEY 는 Kakao Developers -> 내 애플리케이션 -> My App -> 앱 키 (JavaScript 키)

JavaScript API Key

3. App.js

//Line 1
/*global Kakao*/

function App(){

  useEffect(()=>{
      console.log(Kakao.isInitialized())
  },[])

  return(
      ...
  )
}

한 번 더 확인해준다. /*global Kakao*/를 필수적으로 적어주자.

Kakao.Auth.authorize는 redirectUri가 필요하고 이는 등록이 필요하다.

redirectUri는 Kakao Developers -> 내 어플리케이션 -> My App -> 플랫폼 -> Web

React를 통해 사용할 예정이므로 http://localhost:3000을 추가합니다.

const redirectUri = "http://localhost:3000"
const onClickToAuthorize = () =>{
  Kakao.Auth.authorize({
    redirectUri : redirectUri
  })
}

https://developers.kakao.com/docs/latest/ko/kakaologin/common

Kakao.Auth.authorize를 실행시키면 위와같은 화면이 나오고 동의하고 계속하기를 누르면 redirectUri로 code가 전달된다.

ex)localhost:3000/?code=xxxxxxyyyyyyyzzzzzzz

지금은 localhost:3000에서 요청을하고 다시 localhost:3000에서 오기 때문에 뒤에 이어서 /?code=xxx를 감지하는 코드를 짜보자

 

App.js

import {useEffect} from 'react'

function App(){

  useEffect(()=>{
    const authorizeCodeFromKakao = window.location.search.split("=")[1]
    if(authorizeCodeFromKakao !== undefine){
      console.log(`authorizeCodeFromKakao : ${authorizeCodeFromKakao}`)
    }else{
      console.log("No AuthorizeCodeFromKakao")
    }
  },[])

  return (
    ...
  )
}

authorizeCodeFromKakao는 우리가 필요한 "토큰"을 받기위한 도구이다.

토큰을 받기위해서는 JavaScript가 아닌 REST API를 이용해서 받아와야한다.

 

다행이도 React에는 fetch를 통한 REST API작업을 수행할 수 있다(고 들었다. 사실 이번에 처음해본다. ㅠㅠ)

 

/*** 이 구간은 토큰을 받아오기 위한 우여곡절이 담겨있는 부분이므로 빠르게 결과만 보고 싶으시다면 넘어가주세요!

https://developers.kakao.com/docs/latest/ko/kakaologin/js

문서의 안내에 따라 REST API로 토큰받기를 해보겠다. REST API문서로 가서 살펴보자

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

위 처럼 요청하는 방법과 예시에 따라 fetch를 사용하여 적어본다.

(fetch에 대해 무지하기 때문에 구글링을 통해 여러분의 힘을 빌렸다)

velog.io/@ppl8709/TIL-3-fetch-%ED%95%A8%EC%88%98

 

(react) fetch 함수

부트캠프 첫주차에 만든 인스타그램을 리액트로 바꾸는 것까지 진행했다. 이번에는 백엔드에서 API를 받아와서 로그인이 될 수 있도록 작업했다.fetch함수는 API를 사용하여 백엔드 서버와 비동기

velog.io

import {useEffect} from 'react'

function App(){

  useEffect(()=>{
    const authorizeCodeFromKakao = window.location.search.split("=")[1]
    if(authorizeCodeFromKakao !== undefine){
      console.log(`authorizeCodeFromKakao : ${authorizeCodeFromKakao}`)
      
      const body = {
        grant_type: "authorization_code",
        client_id: process.env.REACT_APP_REST_API_KEY,
        redirect_uri: redirect_uri,
        code: authorizeCodeFromKakao
      }
      
      
      fetch("https://kauth.kakao.com/oauth/token",{
        method: "POST",
        headers: {
          'content-type' : 'application/x-www-form-urlencoded;charset=utf-8'
        },
        body : JSON.stringfy(body)
      })
        .then(res => res.json())
        .then((data) => {
          console.log(data)
        })
    }else{
      console.log("No AuthorizeCodeFromKakao")
    }
  },[])

  return (
    ...
  )
}

주의할 점은 client_id 에 Javascript API Key가 아닌 REST API KEY가 필요하다는 점이다.

이는 앞서 설명한 Kakao SDK를 사용하기 위해 Javascript Key를 받는 방법과 동일하다.

(Kakao SDK (in React) 를 사용할 땐 Javascript API Key, fetch 와 같은 REST API를 사용할 땐 REST API KEY)

준비는 끝났으니 로그인을 시도해보자. 는 오류가 뜰 것이다.(in Console)

후... 구글링을 하다 비슷한 상황을 마주치신분이 계셨다.

kdinner.tistory.com/92

 

javascript - 카카오 로그인 with Vue.js

목표 Vue.js를 이용하여 카카오 로그인 카카오 AccessToken, RefreshToken 가져오기 유저 정보 가져오기 준비물 developers.kakao.com/ REST API 키 Javascript 키 Admin 키 Flow 인증 코드 요청 (javascript SDK..

kdinner.tistory.com

이렇게 하면 됩니당***/

결론은 body를 QueryString으로 넣어주어야 한다는 것이였다.

import {useEffect} from 'react'

function App(){

  useEffect(()=>{
    const authorizeCodeFromKakao = window.location.search.split("=")[1]
    if(authorizeCodeFromKakao !== undefine){
      console.log(`authorizeCodeFromKakao : ${authorizeCodeFromKakao}`)
      
      const body = {
        grant_type: "authorization_code",
        client_id: process.env.REACT_APP_REST_API_KEY,
        redirect_uri: redirect_uri,
        code: authorizeCodeFromKakao
      }
      
      const queryStringBody = Object.keys(body)
        .map(k => encodeURIComponent(k) + "=" + encodeURI(body[k]))
        .join("&")
      
      fetch("https://kauth.kakao.com/oauth/token",{
        method: "POST",
        headers: {
          'content-type' : 'application/x-www-form-urlencoded;charset=utf-8'
        },
        body : queryStringBody
      })
        .then(res => res.json())
        .then((data) => {
          console.log(data)
        })
    }else{
      console.log("No AuthorizeCodeFromKakao")
    }
  },[])

  return (
    ...
  )
}

잘된다...

원래는 회원정보까지 받아오고 파이어베이스 Auth에 회원가입까지 하는걸 다 적으려 했는데 진이 빠져서 다음 글에 적도록하겠다.

반응형

댓글