- users 또는 accounts app 안에 로그인 view를 작성해주세요.
- 인스타그램에 회원가입 할 때에는 사용자 계정으로 email을 필수로 필요합니다.
- 인스타그램에 로그인 할 때에는 비밀번호가 필수로 필요합니다.
- 계정이나 패스워드 키가 전달되지 않았을 시, {"message": "KEY_ERROR"}, status code 400 을 반환합니다.
- 계정 잘 못 입력시 {"message": "INVALID_USER"}, status code 401을 반환합니다.
- 비밀번호 잘 못 입력시 {"message": "INVALID_USER"}, status code 401을 반환합니다.
- 로그인이 성공하면 {"message": "SUCCESS"}, status code 200을 반환합니다.
다음 조건을 맞춰 로그인 기능을 구현 해보겠습니다.
회원가입 기능에 이어서 진행하겠습니다.
user/views.py
class UserSignin(View):
def post(self, request):
try:
data = json.loads(request.body)
email = data['email']
password = data['password'].encode('utf-8')
if email == "" or password == "":
return JsonResponse({"message": "KEY_ERROR"}, status=400)
signin_user = User.objects.get(email=email)
encoded_db_password = signin_user.password.encode('utf-8')
if not bcrypt.checkpw(password, encoded_db_password):
return JsonResponse({"message": "INVALID_USER"}, status=401)
user = {"user_id" : signin_user.id}
encode_jwt = jwt.encode(user, SECRET_KEY, ALGORITHM)
return JsonResponse({"token" : encode_jwt, "message" : "SUCCESE"}, status=200)
except KeyError:
return JsonResponse({"message": "KEY_ERROR"}, status=400)
except ObjectDoesNotExist:
return JsonResponse({"message": "INVALID_USER"}, status=401)
import 내용은 회원가입 기능구현에서와 같습니다.
우리는 POST
메서드를 이용하여 회원가입된 정보를 확인해보겠습니다.
문제에서의 조건에 맞게 이메일과 패스워드를 조건문으로 검증하였습니다. 로그인 기능에서 중요한 부분은 JWT 즉 토큰 발행입니다. 로그인할 때마다. 요청에 응답하여 정보와 토큰값을 발행해 주어야합니다. 토큰을 발행해야하는 이유는 인증&인가 글에서 설명해 놓았습니다.
인증 & 인가
JwT
를 발행하는 방법은 다음 링크에서 확인하여 적용하면 될 것입니다.
여기서 한가지 중요한 점은 checkpw
메서드를 사용할 때 비교할 두 패스워드의 type이 같아야 한다는 사실입니다.
checkpw
bcrypt.checkpw(입력한 패스워드, DB에 저장된 패스워드) 둘 다 bytes타입!!
JWT 발행 과정에서 JWT.encode(담을 정보, 시크릿키, 알고리즘)
의 과정으로 토큰을 발행하는데 담을 정보에는 유저id 즉 DB에서 AI(Auto Increment) 되는 id를 가지고 토큰을 발행하는 것이 좋습니다. Header와 Payload는 디코딩을 하면 평문으로 해독이 가능합니다. 따라서 인증정보, 비밀번호와 같은 민감한 정보를 넣으면 안됩니다.
user/urls.py
from django.urls import path
from user.views import UserSignUp, UserSignin
urlpatterns = [
path('/signup', UserSignUp.as_view()),
path('/signin', UserSignin.as_view())
]
각 기능의 url에 맞게 경로 설정을 해줘야합니다. signup url로 요청이 오면 UserSignUp 기능을 가진 곳으로 요청이 전달되고 그 요청 메서드는 as_view()함수가 자동으로 판별하게되어 기능을 수행하게됩니다.
http -v POST localhost:8000/user/signin email="test@naver.com"
nickname="테스트" password= "testpassword123" phone_number= "01011223344"
회원가입에서 생성했던 정보를 그대로 로그인으로 확인해보니 SUCCESS
로 잘 확인된 것을 볼 수있습니다. 토큰또한 잘 발행 되었습니다.
200 OK!!
여기까지 로그인 기능 구현을 해봤습니다.~~