어플리케이션에 카카오 로그인을 도입하면 간편 회원가입을 할 수 있어서 사용자의 접근성을 높일 수 있다.
이를 위해선 카카오 디벨러퍼에서 카카오로그인 신청을 해야한다.
https://developers.kakao.com
developers kakao > 내 애플리케이션 > 애플리케이션 추가하기
결과화면
카카오 로그인 > 간편가입 > 비지니스 설정 바로가기 > 사업자 정보등록
결과화면
이런 식으로 했던거 같은데 정확하게는 기억이 안난다
테스트?용으로 쓸수 있게해주는 탭이 있었던것 같다
이렇게 해주면 다음과 같이 이메일을 필수 동의로 받을 수 있다.
사이트 도메인 등록, 리다이렉트 uri설정
사이트 도메인 : 서버주소
리다이렉트 URI : 프론트 카카오로그인 처리 페이지 주소
이걸 안해주면 카카오에서 사용자정보를 받아오는 요청때 카카오에서 error json을 던져준다
# 프론트에서 http://127.0.0.1:8000/api/accounts/KakaoLogin/로 요청
# urls.py
path('KakaoLogin/', KakaoLogin, name='refresh_token'),
#views.py
def KakaoLogin(request):
# 내 애플리케이션 > 앱 설정 > 요약 정보 > REST API KEY
CLIENT_ID = settings.CLIENT_ID
redirect_uri = "https://j8d103.p.ssafy.io/"
return redirect(
f"https://kauth.kakao.com/oauth/authorize?client_id={CLIENT_ID}&redirect_uri={redirect_uri}&response_type=code"
)
결과화면
리다이렉트 uri
https://accounts.kakao.com/login/.../redirect_uri%3.../client_id%3...
response_type=code에 따라 카카오로그인 플로우가 달라진다
import requests
def kakaoCallBack(request):
code = request.GET.get("code")
CLIENT_ID = settings.CLIENT_ID
redirect_uri = "https://j8d103.p.ssafy.io/"
token_request = requests.get(
f"https://kauth.kakao.com/oauth/token?grant_type=authorization_code&client_id={CLIENT_ID}&redirect_uri={redirect_uri}&code={code}"
)
token_json = token_request.json()
error = token_json.get("error",None)
if error is not None :
return JsonResponse({"message": "INVALID_CODE"}, status = 400)
access_token = token_json.get("access_token")
profile_json = profile_request.json()
kakao_account = profile_json.get("kakao_account")
email = kakao_account.get("email", None)
member = Member.objects.filter(email=email).first()
### 회원가입
if member is None:
nickname = kakao_account.get("profile", None).get("nickname")
member = Member(email=email, nickname=nickname)
member.set_password(settings.SOCIAL_LOGIN_PASSWORD)
member.save()
token = MyTokenObtainPairSerializer.get_token(member)
refresh_token = str(token)
access_token = str(token.access_token)
response = JsonResponse({'email':member.email,'nickname':member.nickname,'access_token':access_token,'refresh_token':refresh_token}, status=200)
return response
### 로그인
else:
token = MyTokenObtainPairSerializer.get_token(member)
refresh_token = str(token)
access_token = str(token.access_token)
response = JsonResponse({'email':member.email,'nickname':member.nickname,'access_token':access_token,'refresh_token':refresh_token}, status=200)
return response
def kakao_login(request):
"""새로고침시 새로운 access_token 발송
:param
:return str email, str nickname, str access_token, str refresh_token
"""
client_id = settings.CLIENT_ID
# redirect_uri = "http://localhost:3000/kakaologin/"
redirect_uri = "https://j8d103.p.ssafy.io/kakaologin/"
print("redirect_uri : ",redirect_uri)
return redirect(
f"https://kauth.kakao.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code"
)
def kakao_callback(request):
"""새로고침시 새로운 access_token 발송
:param str code
:return 카카오로그인페이지
"""
if request.method == 'POST':
data = json.loads(request.body.decode('utf-8'))
code = data.get("code")
client_id = settings.CLIENT_ID
redirect_uri = "https://j8d103.p.ssafy.io/kakaologin/"
token_request = requests.get(
f"https://kauth.kakao.com/oauth/token?grant_type=authorization_code&client_id={client_id}&redirect_uri={redirect_uri}&code={code}"
)
token_json = token_request.json()
error = token_json.get("error",None)
if error is not None :
return JsonResponse({"message": "INVALID_CODE"}, status = 400)
access_token = token_json.get("access_token")
profile_request = requests.get(
"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")
email = kakao_account.get("email", None)
member = Member.objects.filter(email=email).first()
### 회원가입
if member is None:
nickname = kakao_account.get("profile", None).get("nickname")
member = Member(email=email, nickname=nickname)
member.set_password(settings.SOCIAL_LOGIN_PASSWORD)
member.save()
token = MyTokenObtainPairSerializer.get_token(member)
refresh_token = str(token)
access_token = str(token.access_token)
response = JsonResponse({'email':member.email,'nickname':member.nickname,'access_token':access_token,'refresh_token':refresh_token}, status=200)
return response
### 로그인
else:
token = MyTokenObtainPairSerializer.get_token(member)
refresh_token = str(token)
access_token = str(token.access_token)
response = JsonResponse({'email':member.email,'nickname':member.nickname,'access_token':access_token,'refresh_token':refresh_token}, status=200)
return response
return JsonResponse({'error': 'Only POST requests are allowed' },status=405)