본문 바로가기
Python/Django

카카오 소셜 로그인 in Django

by 코드뭉치 2023. 5. 30.

1️⃣ 카카오 로그인의 전반적인 과정 이해하기

카카오 로그인 요청 > 인가 코드 받기 요청 > 인증 및 동의 > 코드 발급(url parameter로 code를 준다)

> 코드로 토큰 발급 요청 > 토큰 발급 > 토큰으로 유저 정보에 access > 해당 정보로 내 서비스에 가입시키면 된다.

 

  • 그 중 REST API를 사용한 카카오 로그인 과정은 다음과 같다.

 

 

2️⃣ 카카오 앱 설정

카카오 애플리케이션

 

Kakao Developers

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

developers.kakao.com

해당 페이지를 참고해 새로운 애플리케이션을 등록해준다.

이미 등록한 애플리케이션이 있다면 카카오 로그인 활성화, Redirect URI, 동의 항목 등 필요한 설정만 확인해주자.

 

 

3️⃣ 인가 코드 받기

REST_API_KEY는 애플리케이션을 생성하면 발급되고, REDIRECT_URI는 애플리케이션 설정에서 지정해줄 수 있다.

 

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

 

  • Javascript에서 요청을 보내는 예시
async function kakaoLogin() {
	const scope = 'profile_nickname,profile_image,account_email'
	window.location.href = `https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code&scope=${scope}`
}

 

해당 주소로 GET요청을 보내면 redirect_uri로 인가 코드를 담은 쿼리스트링을 받아올 수 있다.

각각의 Request Parameter에 관한 것들은 여기에서 확인

 

이때 웹브라우저에 카카오계정 세션이 있다면, 로그인 과정을 거치지 않고, 즉시 동의 화면을 출력하고

카카오계정 세션이 없다면, 로그인 인증화면이 먼저 나오고, 동의 화면이 표시된다.

 

 

4️⃣ 토큰 받기

해당 인가 코드를 다시 아래 형식으로 보내야한다.

 

  • 요청 양식
POST /oauth/token HTTP/1.1
Host: kauth.kakao.com
Content-type: application/x-www-form-urlencoded;charset=utf-8

//////////////////////////////////////////////////////////////////

curl -v -X POST "https://kauth.kakao.com/oauth/token" \
 -H "Content-Type: application/x-www-form-urlencoded" \
 -d "grant_type=authorization_code" \
 -d "client_id=${REST_API_KEY}" \
 --data-urlencode "redirect_uri=${REDIRECT_URI}" \
 -d "code=${AUTHORIZE_CODE}"

 

  • 장고에서의 예시
        auth_code = request.data.get("code")
        kakao_token_api = "https://kauth.kakao.com/oauth/token"
        data = {
            "grant_type": "authorization_code",
            "client_id": KAKAO_REST_API_KEY,
            "redirect_uri": REDIRECT_URI,
            "code": auth_code,
        }
        kakao_token = requests.post(
            kakao_token_api,
            headers={"Content-Type": "application/x-www-form-urlencoded"},
            data=data,
        )

 

 

5️⃣ 유저 정보 가져오기

해당 요청으로 토큰을 가져왔다면, 이 토큰으로 여러가지를 할 수 있다.

해당 토큰으로 할 수 있는 것들(자세한 내용은 여기를 참고)

더보기

로그아웃

카카오계정과 함께 로그아웃

연결 끊기

토큰 정보 보기

토큰 갱신하기

사용자 정보 가져오기

여러 사용자 정보 가져오기

사용자 목록 가져오기

사용자 정보 저장하기

배송지 가져오기

동의 내역 확인하기

동의 철회하기

동의한 약관 확인하기

OpenId Connect

그 중에 우리가 필요한 것은 "사용자 정보 가져오기" 

 

  • 요청 양식
GET/POST /v2/user/me HTTP/1.1
Host: kapi.kakao.com
Authorization: Bearer ${ACCESS_TOKEN}/KakaoAK ${APP_ADMIN_KEY}
Content-type: application/x-www-form-urlencoded;charset=utf-8

curl -v -X GET "https://kapi.kakao.com/v2/user/me" \
  -H "Authorization: Bearer ${ACCESS_TOKEN}"

이번에도 토큰을 해당 양식에 맞게 보내주어야 한다.

 

  • 장고에서의 예시
user_data = requests.get(
            "https://kapi.kakao.com/v2/user/me",
            headers={
                "Authorization": f"Bearer {access_token}",
                "Content-type": "application/x-www-form-urlencoded;charset=utf-8",
            },
        )

 

 

6️⃣ 마무리

이제 해당 데이터를 사용해서 각자 모델에 맞게 데이터를 넣어주면 끝.

댓글