diff --git a/server/apps/wapl/migrations/0002_user_kakao_id.py b/server/apps/wapl/migrations/0002_user_kakao_id.py new file mode 100644 index 0000000..f392fa1 --- /dev/null +++ b/server/apps/wapl/migrations/0002_user_kakao_id.py @@ -0,0 +1,18 @@ +# Generated by Django 4.1.5 on 2023-01-31 09:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wapl', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='kakao_id', + field=models.IntegerField(default=-1), + ), + ] diff --git a/server/apps/wapl/models.py b/server/apps/wapl/models.py index b003f2a..7d77f9b 100644 --- a/server/apps/wapl/models.py +++ b/server/apps/wapl/models.py @@ -10,4 +10,5 @@ class User(AbstractUser): gender = None job = None desc = None - email = models.EmailField(null=True) \ No newline at end of file + email = models.EmailField(null=True) + kakao_id = models.IntegerField(default=-1) \ No newline at end of file diff --git a/server/apps/wapl/templates/login.html b/server/apps/wapl/templates/login.html index 9bbca2f..bd2eeb8 100644 --- a/server/apps/wapl/templates/login.html +++ b/server/apps/wapl/templates/login.html @@ -23,6 +23,7 @@
회원가입 구글 로그인 + 카카오 로그인
diff --git a/server/apps/wapl/templates/test_nickname.html b/server/apps/wapl/templates/test_nickname.html new file mode 100644 index 0000000..e69de29 diff --git a/server/apps/wapl/urls.py b/server/apps/wapl/urls.py index fc7f90d..bc590d6 100644 --- a/server/apps/wapl/urls.py +++ b/server/apps/wapl/urls.py @@ -4,13 +4,13 @@ app_name = "wapl" urlpatterns= [ - path("main", views.main, name="main"), path("login", views.login, name="login"), path("logout", views.logout, name="logout"), path("signup", views.signup, name="signup"), path("", views.start, name="start"), + path("kakao", views.kakao_login, name="kakao_login"), + path("accounts/kakao/login/callback/", views.kakao_callback, name="kakao_callback"), # path("plan", views.create, name="create"), # 용현님 일정 ajax # path("plan/", views.comment, name="comment"), # 윤정님 일정 상세 - ] \ No newline at end of file diff --git a/server/apps/wapl/views.py b/server/apps/wapl/views.py index 35e4b07..a8cbf5d 100644 --- a/server/apps/wapl/views.py +++ b/server/apps/wapl/views.py @@ -2,10 +2,10 @@ from django.shortcuts import render, redirect from django.http.request import HttpRequest from . import forms +from . import models from django.contrib import auth - - -# Create your views here. +import requests +from django.http import JsonResponse def main(request:HttpRequest,*args, **kwargs): return render(request, "main.html") @@ -19,7 +19,7 @@ def signup(request:HttpRequest, *args, **kwargs): if form.is_valid(): user = form.save() auth.login(request, user, backend='django.contrib.auth.backends.ModelBackend') - return redirect('wapl:login') + return redirect('wapl:main') else: return redirect('wapl:signup') else: @@ -36,7 +36,6 @@ def login(request:HttpRequest, *args, **kwargs): if form.is_valid(): user = form.get_user() auth.login(request, user, backend='django.contrib.auth.backends.ModelBackend') - print("로그인 성공~~~~~~~~~") return redirect('wapl:main') else: context = { @@ -53,3 +52,46 @@ def login(request:HttpRequest, *args, **kwargs): def logout(request:HttpRequest, *args, **kwargs): auth.logout(request) return redirect('wapl:start') + +def kakao_login(request, *args, **kwargs): + client_id = "9b8c21fe30f9bef16b12a8a512bf18a0" + REDIRECT_URI = "http://localhost:8000/accounts/kakao/login/callback/" + return redirect( + f"https://kauth.kakao.com/oauth/authorize?client_id={client_id}&redirect_uri={REDIRECT_URI}&response_type=code" + ) + +def kakao_callback(request): + try: + code = request.GET.get("code") + client_id = "9b8c21fe30f9bef16b12a8a512bf18a0" + redirect_uri = "http://localhost:8000/accounts/kakao/login/callback/" + 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") + #------get kakaotalk profile info------# + profile_request = requests.get( + "https://kapi.kakao.com/v2/user/me", headers={"Authorization" : f"Bearer {access_token}"}, + ) + profile_json = profile_request.json() + kakao_id = profile_json.get("id") + except KeyError: + return JsonResponse({"message" : "INVALID_TOKEN"}, status = 400) + except access_token.DoesNotExist: + return JsonResponse({"message" : "INVALID_TOKEN"}, status = 400) + + if models.User.objects.filter(kakao_id = kakao_id).exists(): + user = models.User.objects.get(kakao_id = kakao_id) + login(request, user) + return redirect('wapl:main') + else: + user = models.User( + kakao_id = kakao_id, + ).save() + login(request, user) + return redirect('wapl:main') \ No newline at end of file