Swakakade commited on
Commit
d4bc82a
Β·
verified Β·
1 Parent(s): 50f0dea

Update AUTH.py

Browse files
Files changed (1) hide show
  1. AUTH.py +31 -70
AUTH.py CHANGED
@@ -1,15 +1,14 @@
1
- # auth.py (robust version for different Streamlit versions)
2
  import streamlit as st
3
  import hashlib
4
  from typing import Optional, Dict, Any
5
 
6
  # ---------------- CONFIG ----------------
7
  def _get_password_hash() -> Optional[str]:
8
- raw = None
9
  try:
10
  raw = st.secrets.get("APP_PASSWORD", None)
11
  except Exception:
12
- # st.secrets might throw if not configured β€” treat as None
13
  raw = None
14
  if not raw:
15
  return None
@@ -29,71 +28,46 @@ def logout():
29
 
30
  # ---------------- Query param utilities (compat layer) ----------------
31
  def _get_query_params() -> Dict[str, Any]:
32
- """
33
- Return a dict-like of query params across Streamlit versions.
34
- - Prefer st.query_params if present (newer API).
35
- - Else try st.experimental_get_query_params.
36
- - Else try st.get_query_params (older possibility).
37
- - Else return {}.
38
- """
39
  try:
40
- # modern API returns a dict of lists
41
  if hasattr(st, "query_params"):
42
- qp = dict(st.query_params or {})
43
- return qp
44
  except Exception:
45
  pass
46
-
47
  try:
48
  if hasattr(st, "experimental_get_query_params"):
49
- qp = st.experimental_get_query_params() or {}
50
- return dict(qp)
51
  except Exception:
52
  pass
53
-
54
  try:
55
- # very old variants (some forks)
56
  if hasattr(st, "get_query_params"):
57
- qp = st.get_query_params() or {}
58
- return dict(qp)
59
  except Exception:
60
  pass
61
-
62
  return {}
63
 
64
  def _set_query_params(**kwargs):
65
- """
66
- Set query params using the available API.
67
- kwargs should be key=value where value is string or list.
68
- """
69
  try:
70
- # modern API
71
  if hasattr(st, "set_query_params"):
72
  st.set_query_params(**kwargs)
73
  return
74
  except Exception:
75
  pass
76
-
77
  try:
78
  if hasattr(st, "experimental_set_query_params"):
79
  st.experimental_set_query_params(**kwargs)
80
  return
81
  except Exception:
82
  pass
83
-
84
- try:
85
- if hasattr(st, "set_query_params"): # redundant but safe
86
- st.set_query_params(**kwargs)
87
- return
88
- except Exception:
89
- pass
90
-
91
- # if no API exists, do nothing (can't redirect)
92
  return
93
 
94
- # ---------------- Login widget (use in AUTH page) ----------------
95
- def login_ui():
96
- """Return True only when login succeeded (use in AUTH page)."""
 
 
 
97
  st.title("πŸ”’ Authentication")
98
  st.markdown("Enter the app password to continue.")
99
  pwd = st.text_input("Password", type="password", key="_pwd_input")
@@ -103,34 +77,41 @@ def login_ui():
103
  return False
104
  entered_hash = hashlib.sha256(pwd.encode("utf-8")).hexdigest()
105
  if entered_hash == PASSWORD_HASH:
106
- set_logged_in(True)
107
- st.success("Login successful β€” redirecting...")
108
  return True
109
  else:
110
  st.error("Incorrect password")
111
  return False
112
  return False
113
 
 
 
 
 
 
 
 
 
 
 
 
 
114
  # ---------------- Enforcement helper ----------------
115
  def require_login(auth_page_name: str = "AUTH", redirect_page: Optional[str] = None):
116
  """
117
- Call at top of every page. If user is not logged in:
118
- - redirect user to the auth page and stop rendering.
119
- auth_page_name : exact page title of your AUTH page.
 
120
  """
121
- # ensure session_state key exists
122
  if "_logged_in" not in st.session_state:
123
  st.session_state["_logged_in"] = False
124
 
125
- # If user already logged in, do nothing
126
  if is_logged_in():
127
  return
128
 
129
- # Get current page param in a robust way
130
  params = _get_query_params()
131
  cur_page = None
132
  try:
133
- # params values often are lists (Streamlit), handle both cases
134
  if "page" in params:
135
  p = params["page"]
136
  if isinstance(p, (list, tuple)):
@@ -140,30 +121,10 @@ def require_login(auth_page_name: str = "AUTH", redirect_page: Optional[str] = N
140
  except Exception:
141
  cur_page = None
142
 
143
- # Allow rendering if already on AUTH page (so user can login)
144
  if cur_page == auth_page_name:
145
  return
146
 
147
- # Otherwise set page to AUTH (if set_query API available) and stop
148
  _set_query_params(page=auth_page_name)
149
  st.stop()
150
-
151
- def auth_page_handler(redirect_page="HOME"):
152
- """UI page where user enters password"""
153
- st.title("πŸ” Login Required")
154
-
155
- # Input field
156
- password = st.text_input("Enter password:", type="password")
157
-
158
- # When user submits
159
- if st.button("Login"):
160
- if password == APP_PASSWORD:
161
- st.session_state["authenticated"] = True
162
- st.session_state["auth_time"] = now_ts()
163
- st.success("Login successful! Redirecting...")
164
-
165
- st.switch_page(f"{redirect_page}.py")
166
- st.stop()
167
- else:
168
- st.error("Incorrect password")
169
-
 
1
+ # auth.py β€” robust, single-file authentication helper for Streamlit multipage
2
  import streamlit as st
3
  import hashlib
4
  from typing import Optional, Dict, Any
5
 
6
  # ---------------- CONFIG ----------------
7
  def _get_password_hash() -> Optional[str]:
8
+ """Read APP_PASSWORD from st.secrets and return its SHA256 hex digest or None."""
9
  try:
10
  raw = st.secrets.get("APP_PASSWORD", None)
11
  except Exception:
 
12
  raw = None
13
  if not raw:
14
  return None
 
28
 
29
  # ---------------- Query param utilities (compat layer) ----------------
30
  def _get_query_params() -> Dict[str, Any]:
31
+ """Return query params in a backward/forward compatible manner."""
 
 
 
 
 
 
32
  try:
 
33
  if hasattr(st, "query_params"):
34
+ return dict(st.query_params or {})
 
35
  except Exception:
36
  pass
 
37
  try:
38
  if hasattr(st, "experimental_get_query_params"):
39
+ return dict(st.experimental_get_query_params() or {})
 
40
  except Exception:
41
  pass
 
42
  try:
 
43
  if hasattr(st, "get_query_params"):
44
+ return dict(st.get_query_params() or {})
 
45
  except Exception:
46
  pass
 
47
  return {}
48
 
49
  def _set_query_params(**kwargs):
50
+ """Set query params using available API (best-effort)."""
 
 
 
51
  try:
 
52
  if hasattr(st, "set_query_params"):
53
  st.set_query_params(**kwargs)
54
  return
55
  except Exception:
56
  pass
 
57
  try:
58
  if hasattr(st, "experimental_set_query_params"):
59
  st.experimental_set_query_params(**kwargs)
60
  return
61
  except Exception:
62
  pass
 
 
 
 
 
 
 
 
 
63
  return
64
 
65
+ # ---------------- Login UI and handler ----------------
66
+ def login_ui_inline() -> bool:
67
+ """
68
+ Render login UI and return True if credentials were accepted during this call.
69
+ Does NOT change session state or redirect; caller should set session state.
70
+ """
71
  st.title("πŸ”’ Authentication")
72
  st.markdown("Enter the app password to continue.")
73
  pwd = st.text_input("Password", type="password", key="_pwd_input")
 
77
  return False
78
  entered_hash = hashlib.sha256(pwd.encode("utf-8")).hexdigest()
79
  if entered_hash == PASSWORD_HASH:
 
 
80
  return True
81
  else:
82
  st.error("Incorrect password")
83
  return False
84
  return False
85
 
86
+ def auth_page_handler(redirect_page: str = "HOW TO USE"):
87
+ """
88
+ To be used in pages/AUTH.py.
89
+ Shows login UI; if successful it sets session logged flag and redirects to redirect_page.
90
+ """
91
+ succeeded = login_ui_inline()
92
+ if succeeded:
93
+ set_logged_in(True)
94
+ # set query param to requested page and rerun so multipage switches
95
+ _set_query_params(page=redirect_page)
96
+ st.experimental_rerun()
97
+
98
  # ---------------- Enforcement helper ----------------
99
  def require_login(auth_page_name: str = "AUTH", redirect_page: Optional[str] = None):
100
  """
101
+ Call at the top of every non-AUTH page:
102
+ from auth import require_login
103
+ require_login(auth_page_name="AUTH", redirect_page="HOW TO USE")
104
+ If user is not logged in this will redirect to the AUTH page and stop rendering.
105
  """
 
106
  if "_logged_in" not in st.session_state:
107
  st.session_state["_logged_in"] = False
108
 
 
109
  if is_logged_in():
110
  return
111
 
 
112
  params = _get_query_params()
113
  cur_page = None
114
  try:
 
115
  if "page" in params:
116
  p = params["page"]
117
  if isinstance(p, (list, tuple)):
 
121
  except Exception:
122
  cur_page = None
123
 
124
+ # allow rendering if already on AUTH page (user needs to see login UI)
125
  if cur_page == auth_page_name:
126
  return
127
 
128
+ # otherwise redirect to AUTH page and stop further rendering
129
  _set_query_params(page=auth_page_name)
130
  st.stop()