Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨Feat: 카카오 로그인 구현 #46

Merged
merged 8 commits into from
Sep 30, 2024

Conversation

jiyoon607
Copy link
Contributor

🔥 Pull requests

첫 Pr.. 잘부탁 드립니다..!

👷 작업한 내용

카카오 API를 이용하여 로그인, 회원가입을 구현했습니다. 클라이언트에서 카카오에 인가 코드 발급 요청을 보내면 redirect URI를 통해 서버에 접근하여 로그인/회원가입이 되며, access 토큰과 refresh 토근을 부여합니다. 응답 구조도 맞추어보았습니다!

🚨 참고 사항

현재 로그인/회원가입 시, response로 access 토큰과 refresh 토큰을 반환하지만, 쿠키에 저장이 되지는 않는 문제가 있습니다.

📸 스크린샷

카카오 로그인 성공

카카오로그인성공

카카오 회원가입 성공

회원가입 성공

카카오 인가 코드 오류

카카오토큰오류

🖥️ 주요 코드 설명

  • redirect URI의 콜백함수 코드입니다. 인가 코드를 보내서 access token을 발급 받고 access token을 보내서 프로필 정보를 받습니다. access토큰과 refresh토큰을 발급하여 response로 제공합니다.
    client_id = settings.KAKAO_CLIENT_ID
    code = request.GET.get("code")

    # code로 access token 요청
    token_req = requests.get(f"https://kauth.kakao.com/oauth/token?grant_type=authorization_code&client_id={client_id}&redirect_uri={KAKAO_CALLBACK_URI}&code={code}")
    token_req_json = token_req.json()

    error = token_req_json.get("error", None)
    
    if error is not None:
        raise InvalidToken("The access token from Kakao was invalid.")

    kakao_access_token = token_req_json.get("access_token")
    
    # 프로필 정보 요청
    profile_request = requests.get("https://kapi.kakao.com/v2/user/me", headers={"Authorization": f"Bearer {kakao_access_token}"})
    profile_json = profile_request.json()
    
    kakao_account = profile_json.get('kakao_account')
    email = kakao_account.get('email', None)
    
    try:
        user = User.objects.get(email=email)
        
        # 기존에 kakao로 가입된 유저
        data = {"access_token": kakao_access_token, "code": code}
        accept = requests.post(f"{BACK_BASE_URL}api/v1/accounts/kakao/login/finish/", data=data)
        accept_status = accept.status_code
        
        if accept_status != 200:
            return InvalidToken("Login Failed.")

        accept_json = accept.json()

        # refresh_token을 headers 문자열에서 추출
        refresh_token = accept.cookies.get('refresh_token')
        if not refresh_token:
            raise InvalidToken("Failed to retrieve refresh token.")
        
        access_token = accept_json['access']
        
        data = {
            "access_token": access_token,
            "refresh_token": refresh_token
        }

        return custom_response(data=data, message="Login successful.", code=status.HTTP_200_OK)
  • 토큰 오류를 응답하는 클래스를 작성해보았습니다.. 이렇게 사용하는 것이 맞는지 확인 부탁드립니다..! 문제가 있다면 수정하겠습니다 !
class InvalidToken(APIException):
    status_code = 401
    default_detail = 'The token was invalid.'
    default_code = 'invalid_token' 

✅ Check List

  • Merge 대상 브랜치가 올바른가?
  • 최종 코드가 에러 없이 잘 동작하는가?

📟 관련 이슈

@jiyoon607 jiyoon607 changed the title Jjy kakao notice ✨Feat: 카카오 로그인 구현 Sep 27, 2024
Copy link
Contributor

@JongbeomLee623 JongbeomLee623 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

댓글 확인 후 답변 바랍니다!

accounts/urls.py Outdated Show resolved Hide resolved
accounts/views.py Outdated Show resolved Hide resolved
@jiyoon607
Copy link
Contributor Author

수정했습니다 ! 확인 부탁드립니다 !

@dudtlstm
Copy link
Contributor

확인했습니다. 수고 많으셨습니다 !

@JongbeomLee623 JongbeomLee623 merged commit 84ba3d6 into LINE-NOW:main Sep 30, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Feature] Kakao Login API
3 participants