회원가입 목적의 클래스 생성
class SignUpView(View):
비밀번호의 길이가 정의된 상수
PASSWORD_LENGTH = 8
클라이언트에서 Json 형식(딕셔너리){email=sfs@co.kr, phone_number=121-12123})에 들어있는 정보(body)의 백엔드에서 받겠다
data = json.loads(request.body)
만약에, 클라이언트에서 Json(딕셔너리) 형식의 바디값 (data['email']의 벨류값이)에서 @나, ' 이 없다면 Json 형식으로 INVALID EMAIL 와 함께 400에러값도 함께 보내라
if '@' not in data['email'] or '.' not in data['email']:
return JsonResponse({'MESSAGE':'INVALID EMAIL'}, status=400)
클라이언트에서 보낸 Json(딕셔너리) 형식의 바디값(data['email']) 나의 디비의 테이블안에 email의 벨류값과 일치한다면
DUPLICATED EMAIL 이라는 메시지와 상태값 400을 함께 클라이언트에게 보내라.
if User.objects.filter(email= data['email']).exists():
return JsonResponse({'MESSAGE':'DUPLICATED EMAIL'}, status=400)
클라이언트에서 보낸 Json(딕셔너리) 형식의 바디값(data['password']의 길이가
백엔드 서버에서 정의한 패스워드 길이보다 작다면 INVALID PASSWORD 와 400 상태값을 클라이언트에게 보내라
if len(data['password']) <= PASSWORD_LENGTH :
return JsonResponse({'MESSAGE':'INVALID PASSWORD'}, status=400)

단방향(해쉬로 암호화된 비밀번호는 스스로 복호화 할 수없다)
클라이언트에서 Json 형식으로 보낸 패스워드의 벨류값을 배쉬를 이용하여 된 단방향 암호화(디코딩(문자)->인코딩(bytes))하며 (bcrypt.hashpw) 더불어 Salt : bcrypt.gensalt()를 통해 자동으로 랜덤값을 받을 수 있다
다른글
1) 암호화하기
request.body에서 password를 받고( data['password'] ) 그 password를 인코드하여 ( data['password'].encode('utf-8') ) 바이트화 시킴
그 이후 bcrypt.hashpw를 이용하여 암호화하고( bcrypt.hashpw(data['password']. encode('utf-8'),bcrypt.gensalt()) ) 저장을 위해서 decoding함

hashed_password = bcrypt.hashpw(data['password'].encode('utf-8'),
bcrypt.gensalt()).decode('utf-8')
models.py안에 User라는 클래스에 정의된 쿼리의 벨류값에 클라이언트에서 받은 Json형식의 이름이 비슷한 키값의 벨류값에 저장해라
이 모든 예외값에 통과했다면, SUCCESS라는 말과 201번의 상태값과 함께 나의 디비에 벨류값에 저장시켜라
bcrypt.hashpw를 이용하여 암호화된 패스워드는 패스워드 벨류값으로 지정해라
User.objects.create(
email = data['email'],
password = hashed_password,
name = data['name'],
phone_number= data['phone_number']
)
return JsonResponse({'MESSAGE':'SUCCESS'},status=201)
클라이언트에서 준 Json(딕셔너리)형식의 키값이 나의 쿼리의 키값과 일치하지 않다면 시스템을 종료 시키지말고 키 에러만 보내라
except KeyError:
return JsonResponse({'MESSAGE':'KEY ERROR'}, status=400)
로그인 목적의 클래스 함수
class SignInView(View):
클라이언트에서 보낸 Json(딕셔너리)형식의
email,password,name,phone_number의 4개의 값을 각각
email,password,name,phone_number 라는 변수를 생성 후 집어넣어라
email = data['email']
password = data['password']
name = data.get('name',None)
phone_number= data.get('phone_number',None)
만약에, 클라이언트에서 받은 Json 형식의 email(키)의 벨류값이 나의 디비에 동일한 이메일의 벨류값이 없다면 NOT_FOUND와 동시에 404 상태 메시지를 보내라
if not User.objects.filter(email=email).exists():
return JsonResponse({'MESSAGE':'NOT_FOUND'}, status=404)
내가 디비 테이블에 가지고있는 email의 쿼리의 벨류값이 너가 보낸 email키의 벨류값과 동일한 것을 user라는 변수에 담아라
user = User.objects.get(email=email)
hashed_password라는 변수에
hashed_password = user.password.encode('utf-8')
<임시저장>
클라이언트에서 로그인을 위해 적은 비밀번호가 나의 데이터베이스에 저장된 값과 동일한지 확인의 목적이며, 3. 로그인 부문에 암호화 기능 추가하기 ( 매우 중요 )
로그인 시도시에 입력된 password를 str->bytes 로 변경한 데이터와 DB에서 꺼낸 str->bytes 로 변경한 데이터에 대하여 bcrypt.checkpw(A, B) 를 통해 해당 계정의 비밀번호가 일치하는지 확인하고, 정상이면 "check_password=True" & "account=계정정보" 를 return합니다.
( 또한, input_password는 bcrypt로 변형되기 전 상태여야하며,
account['password'].encode('utf-8')은 bcrypt로 변형된 후의 상태여야 에러없이 checkpw 가능합니다. )
if not bcrypt.checkpw(password.encode('utf-8'),hashed_password):
return JsonResponse({'MESSAGE':'INVALID_USER'}, status=401)
jwt.encode를 이용하여 암호화하여
access_token =jwt.encode({'id':user.id},SECRET_KEY,algorithm='HS256')
return JsonResponse({'MESSAGE':'SUCCESS','ACCESS_TOKEN':access_token}, status=200)
< 도움이 된 감사한 참조 사이트>
<bcrypt.checkpw()관련>
https://growingsaja.tistory.com/347
https://velog.io/@matisse/bcrypt
< jwt 관련>
https://velog.io/@hwang-eunji/backend-django-JWT-%EB%B0%9C%ED%96%89%ED%95%98%EA%B8%B0