Mangesh223 commited on
Commit
784dfb5
·
verified ·
1 Parent(s): ed2329a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +69 -51
app.py CHANGED
@@ -1,20 +1,19 @@
 
 
 
1
  import gradio as gr
2
- from flask import Flask, jsonify, request
3
  from flask_jwt_extended import (
4
  JWTManager, create_access_token,
5
  jwt_required, get_jwt_identity
6
  )
7
- import bcrypt
8
- import json
9
- import os
10
- import requests
11
 
12
- # Initialize Flask
13
  flask_app = Flask(__name__)
14
  flask_app.config["JWT_SECRET_KEY"] = os.getenv("JWT_SECRET_KEY", "super-secret-key")
15
  jwt = JWTManager(flask_app)
16
 
17
- # Simple JSON-based user storage
18
  USERS_FILE = "users.json"
19
 
20
  def load_users():
@@ -28,27 +27,28 @@ def save_users(users):
28
  with open(USERS_FILE, "w") as f:
29
  json.dump(users, f)
30
 
31
- # Flask Routes
 
 
 
32
  @flask_app.route("/register", methods=["POST"])
33
  def register():
34
  data = request.get_json()
35
  username = data.get("username")
36
  password = data.get("password")
37
 
38
- users = load_users()
39
-
40
  if not username or not password:
41
  return jsonify({"error": "Username and password required"}), 400
42
 
 
43
  if username in users:
44
  return jsonify({"error": "Username already exists"}), 400
45
 
46
- # Hash the password using bcrypt
47
- hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
48
- users[username] = {"password": hashed_password}
49
  save_users(users)
50
 
51
- return jsonify({"message": "User created successfully"}), 201
52
 
53
  @flask_app.route("/login", methods=["POST"])
54
  def login():
@@ -59,15 +59,11 @@ def login():
59
  users = load_users()
60
  user = users.get(username)
61
 
62
- if not user:
63
- return jsonify({"error": "Invalid credentials"}), 401
64
-
65
- stored_hashed = user["password"].encode('utf-8')
66
- if not bcrypt.checkpw(password.encode('utf-8'), stored_hashed):
67
  return jsonify({"error": "Invalid credentials"}), 401
68
 
69
  access_token = create_access_token(identity=username)
70
- return jsonify({"access_token": access_token, "username": username})
71
 
72
  @flask_app.route("/protected", methods=["GET"])
73
  @jwt_required()
@@ -75,52 +71,74 @@ def protected():
75
  current_user = get_jwt_identity()
76
  return jsonify(logged_in_as=current_user), 200
77
 
78
- # Gradio Interface Functions
 
 
 
 
 
 
79
  def register_interface(username, password):
80
- response = flask_app.test_client().post(
81
- "/register", json={"username": username, "password": password}
82
- )
83
- return response.get_json().get("message", response.get_json().get("error", "Unknown error"))
 
 
 
 
84
 
85
  def login_interface(username, password):
86
- response = flask_app.test_client().post(
87
- "/login", json={"username": username, "password": password}
88
- )
89
- if response.status_code == 200:
90
- token = response.get_json().get("access_token")
91
- return f"Login successful! Token: {token[:15]}... (truncated)"
92
- return response.get_json().get("error", "Login failed")
 
 
 
 
93
 
94
- # Gradio UI
95
  with gr.Blocks() as demo:
96
- gr.Markdown("# 🔐 JWT Auth with bcrypt (Gradio + Flask)")
97
-
98
  with gr.Tab("Register"):
99
  reg_username = gr.Textbox(label="Username")
100
  reg_password = gr.Textbox(label="Password", type="password")
101
  reg_output = gr.Textbox(label="Output")
102
  reg_button = gr.Button("Register")
 
 
 
 
 
103
 
104
  with gr.Tab("Login"):
105
  login_username = gr.Textbox(label="Username")
106
  login_password = gr.Textbox(label="Password", type="password")
107
  login_output = gr.Textbox(label="Output")
108
  login_button = gr.Button("Login")
 
 
 
 
 
109
 
110
- reg_button.click(
111
- register_interface,
112
- inputs=[reg_username, reg_password],
113
- outputs=reg_output
114
- )
115
-
116
- login_button.click(
117
- login_interface,
118
- inputs=[login_username, login_password],
119
- outputs=login_output
120
- )
121
-
122
- # Mount Gradio onto Flask for Hugging Face Spaces
123
- app = gr.mount_gradio_app(flask_app, demo, path="/")
124
-
125
  if __name__ == "__main__":
126
- app.run()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import json
3
+ import bcrypt
4
  import gradio as gr
5
+ from flask import Flask, request, jsonify
6
  from flask_jwt_extended import (
7
  JWTManager, create_access_token,
8
  jwt_required, get_jwt_identity
9
  )
 
 
 
 
10
 
11
+ # Flask setup
12
  flask_app = Flask(__name__)
13
  flask_app.config["JWT_SECRET_KEY"] = os.getenv("JWT_SECRET_KEY", "super-secret-key")
14
  jwt = JWTManager(flask_app)
15
 
16
+ # File-based user storage
17
  USERS_FILE = "users.json"
18
 
19
  def load_users():
 
27
  with open(USERS_FILE, "w") as f:
28
  json.dump(users, f)
29
 
30
+ # ============================
31
+ # Flask API routes
32
+ # ============================
33
+
34
  @flask_app.route("/register", methods=["POST"])
35
  def register():
36
  data = request.get_json()
37
  username = data.get("username")
38
  password = data.get("password")
39
 
 
 
40
  if not username or not password:
41
  return jsonify({"error": "Username and password required"}), 400
42
 
43
+ users = load_users()
44
  if username in users:
45
  return jsonify({"error": "Username already exists"}), 400
46
 
47
+ hashed = bcrypt.hashpw(password.encode(), bcrypt.gensalt()).decode()
48
+ users[username] = {"password": hashed}
 
49
  save_users(users)
50
 
51
+ return jsonify({"message": "User registered successfully"}), 201
52
 
53
  @flask_app.route("/login", methods=["POST"])
54
  def login():
 
59
  users = load_users()
60
  user = users.get(username)
61
 
62
+ if not user or not bcrypt.checkpw(password.encode(), user["password"].encode()):
 
 
 
 
63
  return jsonify({"error": "Invalid credentials"}), 401
64
 
65
  access_token = create_access_token(identity=username)
66
+ return jsonify({"access_token": access_token, "username": username}), 200
67
 
68
  @flask_app.route("/protected", methods=["GET"])
69
  @jwt_required()
 
71
  current_user = get_jwt_identity()
72
  return jsonify(logged_in_as=current_user), 200
73
 
74
+ # ============================
75
+ # Gradio UI
76
+ # ============================
77
+
78
+ # For local development, use local Flask server
79
+ LOCAL_FLASK_URL = "http://localhost:5000"
80
+
81
  def register_interface(username, password):
82
+ try:
83
+ response = requests.post(
84
+ f"{LOCAL_FLASK_URL}/register",
85
+ json={"username": username, "password": password}
86
+ )
87
+ return response.json().get("message", response.json().get("error", "Unknown error"))
88
+ except Exception as e:
89
+ return f"Error: {str(e)}"
90
 
91
  def login_interface(username, password):
92
+ try:
93
+ response = requests.post(
94
+ f"{LOCAL_FLASK_URL}/login",
95
+ json={"username": username, "password": password}
96
+ )
97
+ if response.status_code == 200:
98
+ token = response.json().get("access_token")
99
+ return f"Login successful! Token: {token[:15]}... (truncated)"
100
+ return response.json().get("error", "Login failed")
101
+ except Exception as e:
102
+ return f"Error: {str(e)}"
103
 
 
104
  with gr.Blocks() as demo:
105
+ gr.Markdown("# 🔐 Secure Auth System (Gradio + Flask + JWT + bcrypt)")
106
+
107
  with gr.Tab("Register"):
108
  reg_username = gr.Textbox(label="Username")
109
  reg_password = gr.Textbox(label="Password", type="password")
110
  reg_output = gr.Textbox(label="Output")
111
  reg_button = gr.Button("Register")
112
+ reg_button.click(
113
+ register_interface,
114
+ inputs=[reg_username, reg_password],
115
+ outputs=reg_output
116
+ )
117
 
118
  with gr.Tab("Login"):
119
  login_username = gr.Textbox(label="Username")
120
  login_password = gr.Textbox(label="Password", type="password")
121
  login_output = gr.Textbox(label="Output")
122
  login_button = gr.Button("Login")
123
+ login_button.click(
124
+ login_interface,
125
+ inputs=[login_username, login_password],
126
+ outputs=login_output
127
+ )
128
 
129
+ # You need to run Flask and Gradio separately
 
 
 
 
 
 
 
 
 
 
 
 
 
 
130
  if __name__ == "__main__":
131
+ # Run this in one terminal: python your_script.py --flask
132
+ # And in another: python your_script.py --gradio
133
+ import argparse
134
+ parser = argparse.ArgumentParser()
135
+ parser.add_argument('--flask', action='store_true')
136
+ parser.add_argument('--gradio', action='store_true')
137
+ args = parser.parse_args()
138
+
139
+ if args.flask:
140
+ flask_app.run(port=5000)
141
+ elif args.gradio:
142
+ demo.launch(port=7860)
143
+ else:
144
+ print("Please specify --flask or --gradio")