[Mission 3] 로그인 엔드포인트 #3

홍태경·2021년 4월 7일
0

프로젝트 이름 : project_westagram
앱 이름 :users
설치 플로그인

  • pip install django-cors-headers
  • pip install pyJWT
  • pip install mysqlclient
  • pip install bcrypt

pip freeze

asgiref==3.3.1
bcrypt==3.2.0
certifi==2020.12.5
cffi==1.14.5
cryptography==3.4.7
Django==3.1.7
django-cors-headers==3.7.0
jwt==1.2.0
mysqlclient==2.0.3
pycparser==2.20
PyJWT==2.0.1
pytz==2021.1
six==1.15.0
sqlparse==0.4.1

로그인 뷰 를 작성해주세요

users 또는 accounts app 안에 로그인 view를 작성해주세요.
인스타그램에 회원가입 할 때에는 사용자 계정(예:전화번호, 사용자 이름 또는 이메일 중 하나)을 필수로 필요합니다.
인스타그램에 로그인 할 때에는 비밀번호가 필수로 필요합니다.

계정이나 패스워드 키가 전달되지 않았을 시, {"message": "KEY_ERROR"}, status code 400 을 반환합니다.

계정이 존재하지 않을 때나 비밀번호가 맞지 않을 때, {"message": "INVALID_USER"}, status code 401을 반환합니다.

로그인이 성공하면 {"message": "SUCCESS"}, status code 200을 반환합니다.

JWT
JWT는 JSON Web Token의 약자로 전자서명 된 URL-safe (URL로 이용할 수 있는 문자로만 구성된)의 JSON 입니다.

JWT는 서버와 클라이언트 간 정보를 주고 받을 때 Http 리퀘스트 헤더에 JSON 토큰을 넣은 후 서버는 별도의 인증 과정없이 헤더에 포함되어 있는 JWT 정보를 통해 인증합니다. 이 인증 과정을 통해 사용자는 로그인 상태로 우리 서비스를 돌아다닐 수 있습니다.

users/models.py

from django.db import models
2
1 class User(models.Model):
2 email = models.CharField(max_length=100)
3 password = models.CharField(max_length=100)
4 name = models.CharField(max_length=45)
5 phone_number = models.CharField(max_length=45)
6
7 class Meta:
8 ¦ db_table = 'users'

users/views.py

import json 1 import bcrypt
⚠ 2 import jwt
3 import bcrypt

✖ 4 from django.http import JsonResponse
✖ 5 from django.views import View
6
7 from .models import User
✖ 8 from my_settings import SECRET_KEY
9
10 class SignUpView(View):
➤ 11 def post(self, request):
12 ¦ PASSWORD_LENGTH = 8
13 ¦
14 ¦ try:
15 ¦ ¦ data = json.loads(request.body)
16
17 ¦ ¦ or '.' not in data['email']:
18 ¦ ¦ ¦ return JsonResponse({'MESSGAGE': 'INVALID EMAIL'}, status=400)
19 ¦ ¦
20 ¦ ¦ if User.objects.filter(email= data['email']).exists():
21 ¦ ¦ ¦ return JsonResponse({'MESSGAGE': 'DUPLICATED EMAIL'}, status=400)
22 ¦ ¦
23 ¦ ¦ if len(data['password']) <= PASSWORD_LENGTH:
24 ¦ ¦ ¦ return JsonResponse({'MESSGAGE': 'INVALID PASSWORD'}, status=400)
25 ¦ ¦

비밀번호를 bcrypt로 암호화 bcrypt 암호화 저장하기위해서는 다음과 같은 bcrypt.hashpw()함수를 사용한다
비밀번호를 Hash화 해주는 메서드를 실행 타입은 무조건 인코드 **bcrypt.gensalt()는 해쉬의 복잡도를 결정해주는 요소이고 디폴트 값은 12**

26 ¦ ¦ hashed_password = bcrypt.hashpw (data['password'].encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
27 ¦ ¦ User.objects.create(
28 ¦ ¦ ¦ email = data['email'],
29 ¦ ¦ ¦ password = hashed_password,
30 ¦ ¦ ¦ name = data['name'],
31 ¦ ¦ ¦ phone_number = data['phone_number']
32 ¦ ¦ )
33 ¦ ¦ return JsonResponse({'MESSAGE': 'SUCCESS'}, status=201)
34 ¦ except KeyError:
35 ¦ ¦ return JsonResponse({'MESSAGE': 'KEY ERROR'}, status=400)

class SignInView(View):
➤ 23 def post(self, request):
22 ¦ data = json.loads(request.body)
21 ¦
20 ¦ try:
19 ¦ ¦ email = data['email']
18 ¦ ¦ password = data['password']
request.get = json 형식으로 들어온 키의 이름이 named을 변수에 담아라,None이란 값이 없어두 된다 라는 의미

➤ 17 ¦ ¦ name = data.get('name', None)
➤ 16 ¦ ¦ phone_number = data.get('phone_number', None)
15
14 ¦ ¦ if not User.objects.filter(email=email).exists():
13 ¦ ¦ ¦ return JsonResponse({'MESSAGE':'NOT_FOUND'}, status=404)
12 ¦ ¦
11 ¦ ¦ user = User.objects.get(email=email)
10 ¦ ¦ hashed_password = user.password.encode('utf-8')
9 ¦ ¦
8 ¦ ¦

암호화해서 저장해놓은 비밀번호와 맞는지 확인
사용자가 입력한 암호와 암호화된 암호 모두 bytes로 인코딩 된 상태여야 비교가 가능

if not bcrypt.checkpw(password.encode('utf-8'), hashed_password):
7 ¦ ¦ ¦ return JsonResponse({'MESSAGE':'INVALID_USER'}, status=401)
6
5 ¦ ¦ access_token = jwt.encode({'user_id' : user.id}, SECRET_KEY, algorithm = 'HS256')
4
3 ¦ ¦ return JsonResponse({'MESSAGE':'SUCCESS', 'ACCESS_TOKEN':access_token}, status=200)
2
1 ¦ except KeyError:
62 ¦ ¦ return JsonResponse({'MESSAGE':'KEY_ERROR'}, status=400)

project_westagram/urls.py

from django.urls import path, include
2
1 urlpatterns = [
19 path('users', include('users.urls'))

users/urls.py

from django.urls import path
5
4 from .views import SignUpView, SignInView
3
2 urlpatterns = [
1 path('/signup', SignUpView.as_view()),
7 path('/signin', SignInView.as_view()),
1 ]

project_westagram/settings.py

15 from os import O_APPEND
14 from pathlib import Path
13 import my_settings

SECRET_KEY = my_settings.SECRET_KEY

DEBUG = False
26
27 ALLOWED_HOSTS = ['*']

INSTALLED_APPS = [
17 # 'django.contrib.admin',
16 # 'django.contrib.auth',
15 'django.contrib.contenttypes',
14 'django.contrib.sessions',
13 'django.contrib.messages',
12 'django.contrib.staticfiles',
11 'corsheaders',
10 'users',

MIDDLEWARE = [
21 'django.middleware.security.SecurityMiddleware',
20 'django.contrib.sessions.middleware.SessionMiddleware',
19 'django.middleware.common.CommonMiddleware',
18 # 'django.middleware.csrf.CsrfViewMiddleware',
17 # 'django.contrib.auth.middleware.AuthenticationMiddleware',
16 'django.contrib.messages.middleware.MessageMiddleware',
15 'django.middleware.clickjacking.XFrameOptionsMiddleware',
14 'corsheaders.middleware.CorsMiddleware'
13 ]

DATABASES = my_settings.DATABASES

STATIC_URL = '/static/'
PPEND_SLASH = False
24
23 ##CORS
22 CORS_ORIGIN_ALLOW_ALL=True
21 CORS_ALLOW_CREDENTIALS = True
20
19 CORS_ALLOW_METHODS = (
18 'DELETE',
17 'GET',
16 'OPTIONS',
15 'PATCH',
14 'POST',
13 'PUT',
12 )
11
10 CORS_ALLOW_HEADERS = (
9 'accept',
8 'accept-encoding',
7 'authorization',
6 'content-type',
5 'dnt',
4 'origin',
3 'user-agent',
2 'x-csrftoken',
1 'x-requested-with',

my_settings.py

DATABASES = {
9 'default' : {
8 ¦ 'ENGINE': 'django.db.backends.mysql',
7 ¦ 'NAME': 'userss',
6 ¦ 'USER': 'root',
5 ¦ 'PASSWORD': 'ubuntu',
4 ¦ 'HOST': 'localhost',
3 ¦ 'PORT': '3306',
2 }
1 }
11 SECRET_KEY = '=6xvu3t)6+8k8vi@b-(g4=2ah@vi*^f@h#fraf)mc-_3@xw8t'

로컬서버 mysql-server

+--------------------+
| Database |
+--------------------+
| django |
| django_insta |
| dog |
| information_schema |
| mysql |
| owner_dogs |
| performance_schema |
| startbucks |
| sys |
| users |
| userss |
+--------------------+

회원가입 및 로그인

http -v post 10.58.2.36:8000/users/signup email=fewfw143241ef@fweff.com password=234232342342423423 name=hregre phone_number=234234234

http -v post 10.58.2.36:8000/users/signin email=fewfw143241ef@fweff.com password=234232342342423423 name=hregre phone_number=234234234

profile
나의 에고를 인정하고 사랑하자

0개의 댓글