반응형
mission 4 merge후 로컬 main에서 git pull origin main으로 로컬 main 업데이트후 main에서 새로운 브랜치 생성후 작업
암호화 적용
- bcrypt 설치
bcrypt 라이브러리를 이용해서 암호화를 할 거라서 설치를 먼저 한다.
pip install bcrypt
- views.py에서 사용할 수 있게 import
# users.views.py
import json, re, bcrypt
- 암호화된 비밀번호를 db에 저장할 수 있도록 코드 수정
class SignUpView(View):
def post(self, request):
try:
data = json.loads(request.body)
name = data['name']
email = data['email']
password = data['password']
mobile_number = data['mobile_number']
REGEX_EMAIL = '^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
REGEX_PASSWORD = '^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$'
if not re.match(REGEX_EMAIL, email):
return JsonResponse({'message':'EMAIL_VALIDATION_FALSE'}, status=400)
if not re.match(REGEX_PASSWORD, password):
return JsonResponse({'message':'PASSWORD_VALIDATION_FALSE'}, status=400)
if User.objects.filter(email=email).exists():
return JsonResponse({'message': 'EMAIL_MUST_BE_UNIQUE'}, status=400)
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
# 그냥 입력받은 password(문자열)를 해싱하려고 하면 인코딩하라는 에러가 뜬다.
# 문자열을 인코딩하면 바이트형이 되는데 바이트 형태만 hashpw메서드에 넣을 수 있다.
# 그래서 'utf-8'형식으로 인코딩한 비밀번호를 솔팅, 해싱 하는데,
# 데이터베이스에는 다시 이 바이트 형태의 데이터를 문자열 형태로 저장하기 위해 utf-8형식으로 디코딩을 해서 새 변수 hashed_password에 저장한다.
User.objects.create(
name = name,
email = email,
password = hashed_password, # 그리고 데이터베이스에 해시화된 비밀번호를 저장한다
mobile_number = mobile_number
)
return JsonResponse({'message': 'SUCCESS'}, status=201)
except KeyError:
return JsonResponse({"message": "KEY_ERROR"}, status=400)
테스트
http -v POST http://127.0.0.1:8000/user/signup name='user1' email='user1@gmail.com' password='user1pw!' mobile_number='01011111234'
POST /user/signup HTTP/1.1
Accept: application/json, */*;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 101
Content-Type: application/json
Host: 127.0.0.1:8000
User-Agent: HTTPie/3.2.1
{
"email": "user1@gmail.com",
"mobile_number": "01011111234",
"name": "user1",
"password": "user1pw!"
}
HTTP/1.1 201 Created
Content-Length: 22
Content-Type: application/json
Cross-Origin-Opener-Policy: same-origin
Date: Sat, 16 Jul 2022 16:09:43 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.9.12
Vary: Origin
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
{
"message": "SUCCESS"
}
데이터베이스에 암호화된 비밀번호가 잘 저장되는 것을 볼 수 있다.
-> 깃헙에 push후 pr남기기
반응형
'wecode' 카테고리의 다른 글
구방문방구 | 데이터베이스 모델링 (0) | 2022.07.24 |
---|---|
[Mission 6] 로그인 JWT 발급 (0) | 2022.07.17 |
[Mission 4] 로그인 기능 구현 (0) | 2022.07.16 |
[Mission 3] 회원가입 기능 구현 (0) | 2022.07.16 |
[Mission 2] 모델링 (0) | 2022.07.16 |