오늘은 프론트에다가 어제만든 소셜로그인기능에 연결을 해야하는데.. 그 연결부분을 찾으면서 연구를 이것저것 해보았다.
전체 코드를 보면
BASE_URL = 'http://localhost:8000/'
KAKAO_CALLBACK_URI = BASE_URL + 'accounts/kakao/callback/'
def kakao_login(request):
rest_api_key = getattr(settings, 'KAKAO_REST_API_KEY')
return redirect(
f"https://kauth.kakao.com/oauth/authorize?client_id={rest_api_key}&redirect_uri={KAKAO_CALLBACK_URI}&response_type=code"
)
def kakao_callback(request):
rest_api_key = getattr(settings, 'KAKAO_REST_API_KEY')
code = request.GET.get("code")
print(code)
redirect_uri = KAKAO_CALLBACK_URI
"""
Access Token Request
"""
token_req = requests.get(f"https://kauth.kakao.com/oauth/token?grant_type=authorization_code&client_id={rest_api_key}&redirect_uri={redirect_uri}&code={code}")
token_req_json = token_req.json()
error = token_req_json.get("error")
if error is not None:
raise JSONDecodeError(error)
access_token = token_req_json.get("access_token")
profile_request = requests.post(
"https://kapi.kakao.com/v2/user/me", headers={"Authorization": f"Bearer {access_token}"})
profile_json = profile_request.json()
kakao_account = profile_json.get('kakao_account')
# print(kakao_account)
email = kakao_account.get('email')
try:
user = User.objects.get(email=email)
# 기존에 가입된 유저의 Provider가 kakao가 아니면 에러 발생, 맞으면 로그인
# 다른 SNS로 가입된 유저
social_user = SocialAccount.objects.get(user=user)
if social_user is None:
return JsonResponse({'err_msg': 'email exists but not social user'}, status=status.HTTP_400_BAD_REQUEST)
if social_user.provider != 'kakao':
return JsonResponse({'err_msg': 'no matching social type'}, status=status.HTTP_400_BAD_REQUEST)
# 기존에 Google로 가입된 유저
data = {'access_token': access_token, 'code': code}
accept = requests.post(
f"{BASE_URL}accounts/kakao/login/finish/", data=data)
accept_status = accept.status_code
if accept_status != 200:
return JsonResponse({'err_msg': 'failed to signin'}, status=accept_status)
accept_json = accept.json()
accept_json.pop('user', None)
return JsonResponse(accept_json)
except User.DoesNotExist:
# 기존에 가입된 유저가 없으면 새로 가입
data = {'access_token': access_token, 'code': code}
accept = requests.post(
f"{BASE_URL}accounts/kakao/login/finish/", data=data)
accept_status = accept.status_code
if accept_status != 200:
return JsonResponse({'err_msg': 'failed to signup'}, status=accept_status)
# user의 pk, email, first name, last name과 Access Token, Refresh token 가져옴
accept_json = accept.json()
accept_json.pop('user', None)
return JsonResponse(accept_json)
class KakaoLogin(SocialLoginView):
adapter_class = kakao_view.KakaoOAuth2Adapter
client_class = OAuth2Client
callback_url = KAKAO_CALLBACK_URI
총 3가지로 나뉘게 되는데 로그인 요청, callback해서 토큰 발급부분, 로그인을 끝마치는부분 이 세가지로 나뉘게되는데 저번에 보여준 로직을 보면 로그인을 요청하는부분이 프론트에서 시작이 되어야하고 카카오 Auth서버가 프론트랑 연결을 해야하는 복잡한 로직을 만들어야 한다..
하지만...자료를 여러개 찾아봤지만 프론트랑 연결하는부분이 감이잡히질 않아서...오늘은 구현을 하질못했는데 여러번 시도를해보았다..
아예 프론트에서 소셜로그인 구현하기
(221) 카카오계정으로 로그인하기 (카카오톡 로그인 API 사용하기) - YouTube
이...이것도 시도해서 로그인을 요청해봤지만,... 실패했다..(이거 한거 기록 보여주고 싶은데 파일이 너무 많아서 몇개 삭제했던 날아간것같다....)ㅠㅠ
그리고 그 사이에 로그인같이 구현했던 팀원 한분이 프론트엔드를 전부다 구현해주셔서....죄송했따 ㅠㅠ소셜로그인 꼭 해결하고 싶었는데 ㅜㅜ
팀원분께서 만들어주신 프론트엔드이다.. 같이참여하지 못해서 죄송할뿐이다... 그래도 소셜로그인 열심히했다는것에 만족은 한다..(덕분에 다른걸 많이놓치긴했지만)
참 프로젝트할때마다 느끼는건데... 한가지일에 집중을 하다가 막히면 아예 포기를하든가 완성을 하든가 해야하는데 그 중간에 머물르다보니 시간이 이렇게 다 가버린것같다....그래도 얻어간것이 조금이라도 있는것에 아쉽...아니 만족... 모르겠따 ㅎㅎㅎ
'Django' 카테고리의 다른 글
62일차 TIL (0) | 2022.11.30 |
---|---|
61일차 TIL 프로젝트 발표날 (0) | 2022.11.29 |
59일차 소셜로그인 (0) | 2022.11.27 |
58일차 소셜 로그인 초 읽기 (0) | 2022.11.27 |
57일차 프로젝트 시작 그리고 S.A 작성 (0) | 2022.11.27 |