Skip to content

Commit edf9246

Browse files
committed
jwt middleware integration
1 parent d2f1953 commit edf9246

18 files changed

+204
-2
lines changed

config/config.py

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
dbconfig = {
2+
"hostname": "localhost",
3+
"username": "root",
4+
"password": "radheradhe",
5+
"dbname": "tset2",
6+
}
7+

controller/userController.py

+50
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
from app import app
22
from model.userModel import UserModel
3+
from middleware.jwt_auth import JWT_Auth
34
from flask import request, make_response, jsonify
5+
from datetime import datetime
46

57
obj = UserModel()
8+
auth = JWT_Auth()
69

710
@app.route("/test")
811
def test():
912
return "test"
1013

14+
1115
@app.route("/user/getall")
16+
@auth.token_auth()
1217
def get_all_route():
1318
try:
1419
response = obj.get_all()
@@ -17,6 +22,7 @@ def get_all_route():
1722
return make_response(jsonify({"error": str(e)}), 500)
1823

1924
@app.route("/user/getone")
25+
@auth.token_auth()
2026
def get_one_route():
2127
try:
2228
response = obj.get_one()
@@ -77,3 +83,47 @@ def delete_all_users_route():
7783
return response
7884
except Exception as e:
7985
return make_response(jsonify({"error": str(e)}), 500)
86+
87+
88+
@app.route("/user/getall/limit/<limit>/page/<page>", methods=["GET"])
89+
def get_all_users_by_limit_route(limit,page):
90+
try:
91+
response = obj.get_all_user_pagination_model(limit,page)
92+
return response
93+
except Exception as e:
94+
return make_response(jsonify({"error": str(e)}), 500)
95+
96+
97+
@app.route("/user/<uid>/upload/avatar", methods=["PUT"])
98+
def user_avatar_route(uid):
99+
file = request.files['avatar']
100+
unique_name = str(datetime.now().timestamp()).replace(".","")
101+
file_extension = file.filename.split(".").pop()
102+
file_name = f"{unique_name}.{file_extension}"
103+
file.save(f"data/{file_name}")
104+
try:
105+
response = obj.avatar_model(file_name,uid)
106+
return response
107+
except Exception as e:
108+
return make_response(jsonify({"error": str(e)}), 500)
109+
110+
111+
@app.route("/user/avatar/<filename>",methods=["GET"])
112+
def user_get_avatar_route(filename):
113+
try:
114+
response = obj.get_avatar_model(filename)
115+
except Exception as e:
116+
return make_response(jsonify({"error": str(e)}), 500)
117+
else:
118+
return response
119+
120+
121+
@app.route("/user/login", methods=["POST"])
122+
def user_login_route():
123+
data = request.form
124+
try:
125+
response = obj.user_login_model(data)
126+
except Exception as e:
127+
return make_response(jsonify({"error": str(e)}), 500)
128+
else:
129+
return response

data/1708277547198316.jpg

75.1 KB
Loading

data/1708277549119973.jpg

75.1 KB
Loading

data/1708277550121725.jpg

75.1 KB
Loading

data/1708277551283379.jpg

75.1 KB
Loading

data/1708277558973497.jpg

75.1 KB
Loading

data/1708277562522564.jpg

75.1 KB
Loading

data/1708277835816786.jpg

75.1 KB
Loading

data/1708277839158938.jpg

75.1 KB
Loading

data/1708277840073809.jpg

75.1 KB
Loading

data/1708278306628841.jpg

75.1 KB
Loading

data/1708278319932909.jpg

75.1 KB
Loading

data/1708278365515102.jpg

75.1 KB
Loading

data/1708278380418824.jpg

75.1 KB
Loading

data/4.jpg

75.1 KB
Loading

middleware/jwt_auth.py

+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import mysql.connector
2+
import json
3+
import random
4+
from flask import make_response, jsonify, send_file, request
5+
from datetime import datetime, timedelta
6+
import jwt
7+
import re
8+
import ast
9+
from functools import wraps
10+
11+
class JWT_Auth:
12+
def __init__(self):
13+
try:
14+
self.con = mysql.connector.connect(host="localhost", user="root", password="radheradhe", database="tset2")
15+
self.cur = self.con.cursor(dictionary=True)
16+
print('Connection successful')
17+
except Exception as e:
18+
print("Some error: ", e)
19+
20+
21+
def token_auth(self,endpoint=""):
22+
def inner1(func):
23+
24+
@wraps(func)
25+
26+
def inner2(*args):
27+
28+
endpoint = request.url_rule
29+
30+
31+
Authorization_token = request.headers.get("Authorization")
32+
33+
if re.match("^Bearer *([^ ]+) *$", Authorization_token, flags=0):
34+
token = Authorization_token.split(" ").pop()
35+
36+
try:
37+
auth_user_data = jwt.decode(token, "hello", algorithms="HS256")
38+
except jwt.ExpiredSignatureError:
39+
return make_response(make_response({"ERROR":"TOKEN_EXPIRED"}, 401))
40+
41+
42+
role_id = auth_user_data["payload"]["role_id"]
43+
44+
self.cur.execute(f"select roles from accessibility_view where endpoint = '{endpoint}'")
45+
46+
res = self.cur.fetchall()
47+
48+
if len(res)>0:
49+
50+
roles = res[0]["roles"]
51+
52+
# roles = ast.literal_eval(roles)
53+
54+
55+
if role_id in json.loads(roles):
56+
57+
return func(*args)
58+
else:
59+
return make_response({"ERROR":"INVALID_ROLE"}, 401)
60+
61+
62+
63+
else:
64+
return make_response({"ERROR":"end point not found"}, 401)
65+
66+
67+
68+
else:
69+
return make_response({"ERROR":"Invalid Token"}, 401)
70+
71+
return inner2
72+
73+
return inner1
74+
75+

model/userModel.py

+72-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
import mysql.connector
22
import json
33
import random
4-
from flask import make_response, jsonify
4+
from flask import make_response, jsonify, send_file
5+
from datetime import datetime, timedelta
6+
import jwt
7+
from config.config import dbconfig
58

69
class UserModel:
710
def __init__(self):
811
try:
9-
self.con = mysql.connector.connect(host="localhost", user="root", password="radheradhe", database="tset2")
12+
self.con = mysql.connector.connect(host=dbconfig["hostname"], user=dbconfig["username"], password=dbconfig["password"], database=dbconfig["dbname"])
1013
self.cur = self.con.cursor(dictionary=True)
1114
print('Connection successful')
1215
except Exception as e:
@@ -128,3 +131,70 @@ def delete_all_users(self):
128131
return make_response(jsonify({"message": "All users deleted"}), 200)
129132
else:
130133
return make_response(jsonify({"message": "Either users not found or no data to change"}), 204)
134+
135+
136+
def get_all_user_pagination_model(self,limit,page):
137+
try:
138+
limit = int(limit)
139+
page = int(page)
140+
start = (page*limit)-limit
141+
query = f"SELECT * FROM new_table limit {start},{limit}"
142+
self.cur.execute(query)
143+
data = self.cur.fetchall()
144+
if data:
145+
res = make_response(jsonify({"payload": data}), 200)
146+
# res.headers["Access-Control-Allow-Origin"] = "*" # CORS now there is no need to implement it here for all the methods.
147+
# it is implemented in app.py file
148+
return res
149+
else:
150+
return make_response(jsonify({"message": "No data found"}), 204)
151+
except Exception as e:
152+
return make_response(jsonify({"error": f"Error fetching data: {str(e)}"}), 500)
153+
154+
155+
def avatar_model(self, file_name,uid):
156+
try:
157+
query = f"UPDATE new_table SET avatar='{file_name}' WHERE id={uid}"
158+
self.cur.execute(query)
159+
row_affected = self.cur.rowcount
160+
except Exception as e:
161+
return make_response(jsonify({"error": str(e)}), 500)
162+
else:
163+
self.con.commit()
164+
if row_affected > 0:
165+
return make_response(jsonify({"message": f"User {id} updated"}), 200)
166+
else:
167+
return make_response(jsonify({"message": f"User {id} not found or something went wrong!"}), 204)
168+
169+
def get_avatar_model(self, file_name):
170+
try:
171+
return send_file(f"data/{file_name}")
172+
except Exception as e:
173+
return make_response(jsonify({"message": f"User {id} not found or something went wrong!"}), 204)
174+
175+
176+
def user_login_model(self,data):
177+
id = data["id"]
178+
# name = data["name"]
179+
try:
180+
query = f"SELECT * FROM new_table WHERE id={id}"
181+
self.cur.execute(query)
182+
data = self.cur.fetchall()
183+
user_data = data[0]
184+
exp_time = datetime.now() + timedelta(minutes=15)
185+
exp_epoch_time = int(exp_time.timestamp())
186+
secrete_key = "hello"
187+
payload = {
188+
"payload":user_data,
189+
"exp":exp_epoch_time
190+
}
191+
token = jwt.encode(payload, secrete_key, algorithm="HS256")
192+
193+
if data:
194+
res = make_response({"token":token}, 200)
195+
return res
196+
else:
197+
return make_response(jsonify({"message": "No data found"}), 204)
198+
except Exception as e:
199+
return make_response(jsonify({"error": f"Error fetching data: {str(e)}"}), 500)
200+

0 commit comments

Comments
 (0)