66from flask import Blueprint , jsonify , request
77from pymysql import MySQLError
88
9- from db import get_db_connection
9+ from db import database_cursor , get_db_connection
1010from jwt_helper import (
1111 TokenError ,
1212 extract_token_from_header ,
@@ -42,6 +42,27 @@ def validate_password(password):
4242 )
4343
4444
45+ def get_person_by_email (email ):
46+ with database_cursor () as cursor :
47+ cursor .callproc ("login_person" , (email ,))
48+ return cursor .fetchone ()
49+
50+
51+ def verify_password (password , stored_password , salt ):
52+ seasoned_password = password .encode ("utf-8" ) + salt + PEPPER
53+ try :
54+ return ph .verify (stored_password , seasoned_password )
55+ except exceptions .VerifyMismatchError :
56+ return False
57+
58+
59+ def update_last_login (person_id ):
60+ db = get_db_connection ()
61+ with database_cursor () as cursor :
62+ cursor .callproc ("update_last_login" , (person_id ,))
63+ db .commit ()
64+
65+
4566@authentication_blueprint .route ("/register" , methods = ["POST" ])
4667def register ():
4768 data = request .get_json ()
@@ -59,7 +80,7 @@ def register():
5980 hashed_password , salt = hash_password_with_salt_and_pepper (password )
6081
6182 db = get_db_connection ()
62- with db . cursor () as cursor :
83+ with database_cursor () as cursor :
6384 try :
6485 cursor .callproc (
6586 "register_person" , (name , email , hashed_password , salt , language_code )
@@ -74,7 +95,6 @@ def register():
7495 else :
7596 return jsonify (message = "An error occurred during registration" ), 500
7697
77- db .close ()
7898 return jsonify (message = "User created successfully" ), 201
7999
80100
@@ -87,30 +107,26 @@ def login():
87107 if not email or not password :
88108 return jsonify (message = "Email and password are required" ), 400
89109
90- db = get_db_connection ()
91- with db .cursor () as cursor :
92- cursor .callproc ("login_person" , (email ,))
93- person = cursor .fetchone ()
94-
95- if not person :
96- return jsonify (message = "Invalid credentials" ), 401
97-
98- person_id = person ["person_id" ]
99- stored_password = person ["hashed_password" ]
100- salt = person ["salt" ]
101- seasoned_password = password .encode ("utf-8" ) + salt + PEPPER
110+ person = get_person_by_email (email )
102111
103- try :
104- ph .verify (stored_password , seasoned_password )
105- access_token = generate_access_token (person_id )
106- refresh_token = generate_refresh_token (person_id )
107- return jsonify (
108- message = "Login successful" ,
109- access_token = access_token ,
110- refresh_token = refresh_token ,
111- )
112- except exceptions .VerifyMismatchError :
112+ try :
113+ if not person or not verify_password (
114+ password , person ["hashed_password" ], person ["salt" ]
115+ ):
113116 return jsonify (message = "Invalid credentials" ), 401
117+ except Exception as e :
118+ return jsonify (message = "An error occurred" , error = str (e )), 500
119+
120+ person_id = person ["person_id" ]
121+ access_token = generate_access_token (person_id )
122+ refresh_token = generate_refresh_token (person_id )
123+ update_last_login (person_id )
124+
125+ return jsonify (
126+ message = "Login successful" ,
127+ access_token = access_token ,
128+ refresh_token = refresh_token ,
129+ )
114130
115131
116132@authentication_blueprint .route ("/refresh" , methods = ["POST" ])
0 commit comments