WestaGram 회원가입/암호화, 로그인/토큰 발행

.·2020년 5월 19일
0

Coding

목록 보기
23/33

1. 모듈 import 하기 (views.py)

import json
import bcrypt
import jwt

from django.views import View
from django.http import HttpResponse, JsonResponse

from .models import Account
from westagram_project.settings import SECRET_KEY

2. 회원가입(SignUpView) bcrypt 로 hashpw화 + 소금치기

class SignUpView(View):
	def post(self, request):
    signup_data = json.loads(request.body)
    
    try:
    	if Account.objects.filter(email=signup_data['email']).exists():
        	return HttpResponse(status=400)
        
        # encryption below
        
        # 입력된 password 는 문자열형태 이므로 hashpw 화를 위해 bytes 형태로 encoding.
        password = signup_data['password'].encode('utf-8')
        
        # 파이썬 쉘에서 연습해본 대로 hashpw 화 시킨다. (인코딩된 password + 소금치기)
        password_encrypt = bcrypt.hashpw(password, bcrypt.gensalt())
        
        # DB 에 (models.py 에서 정의한 password 의 필드셋을 확인해볼것) 저장할 수 있는 유니코드 문자열 형태로 디코딩
        password_encrypt = password_encrypt.decode('utf-8')
        
        # 암호화된 password_encrypt 를 변수 password 로 DB 에 저장.
        Account(
            email = signup_data['email'],
            password = password_encrypt
        ).save()
        
        return HttpResponse(status=200)
	
    except KeyError:
    	return JsonResponse({"message":"INVALID_KEYS"}, status=400)

3. 로그인(SignInView) 비밀번호 확인 및 토큰 발행

로그인을 할 때 사용자가 입력한 비밀번호가, DB 에 있는 사용자의 이메일과 매칭되는 비밀번호와 일치하는지 확인해야 한다. 일치한다면 토큰을 발행해서 HTTP 응답에 같이 넘겨주면 된다.

비밀번호가 일치하는지 확인한다는 말은, 비밀번호 그 자체를 비교한다는 뜻이 아니고 회원가입시 저장해 놓은 암호화된 비밀번호 와 사용자가 로그인을 위해 이번에 입력한 비밀번호를 bcrypt.check 메서드로 비교해서 True or False 의 결과값을 주는 것이라고 한다.

비밀번호 확인 후 토큰이 생성되면 Json Response 로 토큰을 응답할 수 있도록 유니코드 문자열로 디코딩해 값을 전달해 준다.

class SignInView(View):
	def post(self, request):
    	signin_data = json.loads(request.body)
        
        try:
        	if Account.objects.filter(email=signin_data['email']).exists():
            	user = Account.objects.get(email=signin_data['email'])
                
                ## check password from database
                
                # 사용자가 입력한 비밀번호 인코딩, 사용자이메일과 매칭되는 DB 의 비밀번호 인코딩. 
                # 이 두 값을 bcrypt.checkpw 로 비교한다.
                
                    if bcrypt.checkpw(signin_data['password'].encode('utf-8'), user.password.encode('utf-8')):
                
                	# 토큰발행, 유니코드 문자열로 디코딩, 토큰을 담아 응답
                        token = jwt.encode({'email':signin_data['email']}, SECRET_KEY, algorithm = "HS256")
                        token = token.decode('utf-8')
                    
                        return JsonResponse({"token":token}, status=200)
                    
                    else:
                        return HttpResponse(status=401)
                    
    		return HttpResponse(status=400)
  		
        except KeyError:
        	return JsonResponse({"message":"INVALID_KEYS"}, status=400)
profile
.

0개의 댓글