From 7cea4ba1a1dbba53e2f31e0855b1b697b4988798 Mon Sep 17 00:00:00 2001 From: summit45 Date: Wed, 27 Jul 2022 15:04:08 +0900 Subject: [PATCH] =?UTF-8?q?[feat]=20jwt=20accesstoken=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- rememB/balanceapp/migrations/0001_initial.py | 39 ------ rememB/balanceapp/migrations/__init__.py | 0 rememB/balanceapp/models.py | 2 +- rememB/letterapp/migrations/0001_initial.py | 28 ---- rememB/letterapp/migrations/__init__.py | 0 rememB/letterapp/models.py | 2 +- rememB/mainapp/admin.py | 3 - rememB/mainapp/migrations/0001_initial.py | 21 --- .../migrations/0002_user_delete_blog.py | 27 ---- rememB/mainapp/migrations/__init__.py | 0 rememB/mainapp/models.py | 6 - rememB/rememB/settings.py | 3 +- rememB/userapp/admin.py | 2 + rememB/userapp/migrations/__init__.py | 0 rememB/userapp/models.py | 8 ++ rememB/userapp/serializers.py | 12 ++ rememB/userapp/tokens.py | 21 +++ rememB/userapp/urls.py | 14 +- rememB/userapp/views.py | 122 +++++++++++++++++- 20 files changed, 180 insertions(+), 133 deletions(-) delete mode 100644 rememB/balanceapp/migrations/0001_initial.py delete mode 100644 rememB/balanceapp/migrations/__init__.py delete mode 100644 rememB/letterapp/migrations/0001_initial.py delete mode 100644 rememB/letterapp/migrations/__init__.py delete mode 100644 rememB/mainapp/migrations/0001_initial.py delete mode 100644 rememB/mainapp/migrations/0002_user_delete_blog.py delete mode 100644 rememB/mainapp/migrations/__init__.py delete mode 100644 rememB/userapp/migrations/__init__.py create mode 100644 rememB/userapp/serializers.py create mode 100644 rememB/userapp/tokens.py diff --git a/.gitignore b/.gitignore index 217d728..f7b5284 100644 --- a/.gitignore +++ b/.gitignore @@ -305,4 +305,5 @@ cython_debug/ Myvenv/ .DS_Store -myvenv/ \ No newline at end of file +myvenv/ +.env \ No newline at end of file diff --git a/rememB/balanceapp/migrations/0001_initial.py b/rememB/balanceapp/migrations/0001_initial.py deleted file mode 100644 index 39f7c8b..0000000 --- a/rememB/balanceapp/migrations/0001_initial.py +++ /dev/null @@ -1,39 +0,0 @@ -# Generated by Django 4.0.6 on 2022-07-18 12:06 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('mainapp', '0002_user_delete_blog'), - ] - - operations = [ - migrations.CreateModel( - name='Answer', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('answer_content', models.CharField(max_length=200)), - ], - ), - migrations.CreateModel( - name='Question', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('question_content', models.CharField(max_length=200)), - ], - ), - migrations.CreateModel( - name='Balance', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('answer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='balanceapp.answer')), - ('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='balanceapp.question')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mainapp.user')), - ], - ), - ] diff --git a/rememB/balanceapp/migrations/__init__.py b/rememB/balanceapp/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/rememB/balanceapp/models.py b/rememB/balanceapp/models.py index e23c114..adc73d9 100644 --- a/rememB/balanceapp/models.py +++ b/rememB/balanceapp/models.py @@ -1,5 +1,5 @@ from django.db import models -from mainapp.models import User +from userapp.models import User # Create your models here. class Question(models.Model): diff --git a/rememB/letterapp/migrations/0001_initial.py b/rememB/letterapp/migrations/0001_initial.py deleted file mode 100644 index 84c56c4..0000000 --- a/rememB/letterapp/migrations/0001_initial.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 4.0.6 on 2022-07-18 12:06 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('mainapp', '0002_user_delete_blog'), - ] - - operations = [ - migrations.CreateModel( - name='Letter', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('letter_content', models.CharField(max_length=300)), - ('img_no', models.IntegerField()), - ('created_at', models.DateTimeField(auto_now=True)), - ('position_x', models.IntegerField()), - ('position_y', models.IntegerField()), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mainapp.user')), - ], - ), - ] diff --git a/rememB/letterapp/migrations/__init__.py b/rememB/letterapp/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/rememB/letterapp/models.py b/rememB/letterapp/models.py index 7e79658..7037200 100644 --- a/rememB/letterapp/models.py +++ b/rememB/letterapp/models.py @@ -1,6 +1,6 @@ from django.db import models -from mainapp.models import User +from userapp.models import User class Letter(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) # 유저와 연동 diff --git a/rememB/mainapp/admin.py b/rememB/mainapp/admin.py index 764e605..694323f 100644 --- a/rememB/mainapp/admin.py +++ b/rememB/mainapp/admin.py @@ -1,4 +1 @@ from django.contrib import admin -from .models import User - -admin.site.register(User) \ No newline at end of file diff --git a/rememB/mainapp/migrations/0001_initial.py b/rememB/mainapp/migrations/0001_initial.py deleted file mode 100644 index 87541f2..0000000 --- a/rememB/mainapp/migrations/0001_initial.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 4.0.6 on 2022-07-15 13:53 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Blog', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('text', models.TextField()), - ], - ), - ] diff --git a/rememB/mainapp/migrations/0002_user_delete_blog.py b/rememB/mainapp/migrations/0002_user_delete_blog.py deleted file mode 100644 index 75cc6b8..0000000 --- a/rememB/mainapp/migrations/0002_user_delete_blog.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 4.0.6 on 2022-07-18 12:06 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('mainapp', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='User', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('uuid', models.CharField(max_length=100)), - ('name', models.CharField(max_length=100)), - ('birthyear', models.CharField(max_length=100)), - ('birthday', models.CharField(max_length=100)), - ('email', models.CharField(max_length=100)), - ], - ), - migrations.DeleteModel( - name='Blog', - ), - ] diff --git a/rememB/mainapp/migrations/__init__.py b/rememB/mainapp/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/rememB/mainapp/models.py b/rememB/mainapp/models.py index f57f666..4167352 100644 --- a/rememB/mainapp/models.py +++ b/rememB/mainapp/models.py @@ -1,9 +1,3 @@ from django.db import models -class User(models.Model): - uuid = models.CharField(max_length=100) - name = models.CharField(max_length=100) - birthyear = models.CharField(max_length=100) - birthday = models.CharField(max_length=100) - email = models.CharField(max_length=100) diff --git a/rememB/rememB/settings.py b/rememB/rememB/settings.py index b67f747..0e2e2b7 100644 --- a/rememB/rememB/settings.py +++ b/rememB/rememB/settings.py @@ -11,6 +11,7 @@ """ from pathlib import Path +from decouple import config # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -20,7 +21,7 @@ # See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = 'django-insecure-xmbee_n!(mzgjc6!po*ut&7a2g7mq%^u0h-yl*ya=f61@de@6-' +SECRET_KEY = config("SECRET_KEY") # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True diff --git a/rememB/userapp/admin.py b/rememB/userapp/admin.py index c6fe108..764e605 100644 --- a/rememB/userapp/admin.py +++ b/rememB/userapp/admin.py @@ -1,2 +1,4 @@ from django.contrib import admin +from .models import User +admin.site.register(User) \ No newline at end of file diff --git a/rememB/userapp/migrations/__init__.py b/rememB/userapp/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/rememB/userapp/models.py b/rememB/userapp/models.py index 71a8362..6e2a83e 100644 --- a/rememB/userapp/models.py +++ b/rememB/userapp/models.py @@ -1,3 +1,11 @@ from django.db import models # Create your models here. +class User(models.Model): + email = models.CharField(max_length=100) + provider = models.CharField(max_length=100) + user_name = models.CharField(max_length=100) + birthday = models.DateField() + access_token = models.CharField(max_length=200) + refresh_token = models.CharField(max_length=200) + expire = models.CharField(max_length=100) diff --git a/rememB/userapp/serializers.py b/rememB/userapp/serializers.py new file mode 100644 index 0000000..92901dd --- /dev/null +++ b/rememB/userapp/serializers.py @@ -0,0 +1,12 @@ +from rest_framework import serializers +from .models import User + +class UserSerializer(serializers.ModelSerializer): # 유저 추가 + class Meta: + model = User + fields = ('id', 'email', 'provider', 'user_name', 'birthday') + +class UserFindSerializer(serializers.ModelSerializer): # 유저 추가 + class Meta: + model = User + fields = ('email', 'provider') diff --git a/rememB/userapp/tokens.py b/rememB/userapp/tokens.py new file mode 100644 index 0000000..7aed3ce --- /dev/null +++ b/rememB/userapp/tokens.py @@ -0,0 +1,21 @@ +# 토큰 발급, 복호화하기 위한 함수 관리를 위한 페이지 + +import jwt +import datetime +from decouple import config + +def generate_token(payload, type): # payload 값과 토큰의 종류 + if type == "access": + # 2시간 + exp = datetime.datetime.utcnow() + datetime.timedelta(hours=2) + elif type == "refresh": + # 2주 + exp = datetime.datetime.utcnow() + datetime.timedelta(weeks=2) + else: + raise Exception("Invalid tokenType") + + payload['exp'] = exp + payload['iat'] = datetime.datetime.utcnow() # 발급 시간 + encoded = jwt.encode(payload, config("JWT_SECRET_KEY"), algorithm="HS256") + + return encoded \ No newline at end of file diff --git a/rememB/userapp/urls.py b/rememB/userapp/urls.py index 23214b1..0c45842 100644 --- a/rememB/userapp/urls.py +++ b/rememB/userapp/urls.py @@ -1,6 +1,12 @@ -from django.urls import path -from . import views +from django.urls import path, include +from .views import * +from rest_framework.routers import DefaultRouter -urlpatterns=[ - path('login/',views.login, name='login'), +routers = DefaultRouter() +routers.register('auth', AuthViewSet, basename='auth') + +urlpatterns = [ + path('', include(routers.urls)), + path('signin/', UserList.as_view()), + path('find/', UserFind.as_view()), ] \ No newline at end of file diff --git a/rememB/userapp/views.py b/rememB/userapp/views.py index 34e140f..a8cb3a2 100644 --- a/rememB/userapp/views.py +++ b/rememB/userapp/views.py @@ -1,4 +1,124 @@ from django.shortcuts import render +from rest_framework.views import APIView +from rest_framework.response import Response +from rest_framework import status +from rest_framework.decorators import action +from rest_framework import viewsets + +from .serializers import UserFindSerializer, UserSerializer +from .models import User +from .tokens import * + +# Create your views here. +class UserList(APIView): + def post(self, request): # 회원 등록하는 경우 + serializer = UserSerializer(data = request.data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def get(self, request): # 회원 조회하는 경우 + users = User.objects.all() + serializer = UserSerializer(users, many=True) # 다수의 쿼리셋 전달 위해서 many = True + return Response(serializer.data) + +class UserFind(APIView): + def post(self, request): + serializer = UserFindSerializer(data = request.data) + if serializer.is_valid(): + email = request.data['email'] + provider = request.data['provider'] + try: + user = User.objects.get( + email=email, + provider=provider + ) + print(user.id) + # payload에 넣을 값 커스텀 가능 + payload_value = user.id + payload = { + "subject": payload_value, + } + + access_token = generate_token(payload, "access") + + data = { + "results": { + "access_token": access_token + } + } + + return Response(data=data, status=status.HTTP_200_OK) + + except User.DoesNotExist: + data = { + "results": { + "msg": "유저 정보가 올바르지 않습니다.", + "code": "E4010" + } + } + return Response(data=data, status=status.HTTP_401_UNAUTHORIZED) + + except Exception as e: + print(e) + data = { + "results": { + "msg": "정상적인 접근이 아닙니다.", + "code": "E5000" + } + } + return Response(data=data, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + + +class AuthViewSet(viewsets.GenericViewSet): + @action(methods=['POST'], detail=False) + def signin(self, request): + email = request.data['email'] + provider = request.data['provider'] + print(email, provider) + try: + user = User.objects.get( + email=email, + provider=provider + ) + + # payload에 넣을 값 커스텀 가능 + payload_value = user.id + payload = { + "subject": payload_value, + } + + access_token = generate_token(payload, "access") + + data = { + "results": { + "access_token": access_token + } + } + + return Response(data=data, status=status.HTTP_200_OK) + + except User.DoesNotExist: + data = { + "results": { + "msg": "유저 정보가 올바르지 않습니다.", + "code": "E4010" + } + } + return Response(data=data, status=status.HTTP_401_UNAUTHORIZED) + + except Exception as e: + print(e) + data = { + "results": { + "msg": "정상적인 접근이 아닙니다.", + "code": "E5000" + } + } + return Response(data=data, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + def login(request): - return render(request,'userapp/login.html') + return render(request,'userapp/login.html') \ No newline at end of file