ChandimaPrabath commited on
Commit
05777c4
·
1 Parent(s): 421675f

login and validate is now utc 0

Browse files
Files changed (1) hide show
  1. main.py +22 -8
main.py CHANGED
@@ -131,34 +131,44 @@ async def signup(request: SignupRequest):
131
  supabase.table("users").insert(user_data).execute()
132
  return {"message": "User created successfully"}
133
 
 
 
134
  @auth_router.post("/login", response_model=LoginResponse)
135
  async def login(request: LoginRequest, user_agent: str = Header(...)):
 
136
  user_query = supabase.table("users").select("*").eq("username", request.username).execute()
137
 
 
138
  if not user_query.data or not verify_password(request.password, user_query.data[0]["password"]):
139
  raise HTTPException(
140
  status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid credentials"
141
  )
142
 
 
143
  user = user_query.data[0]
 
 
144
  token = create_device_token(request.username, user_agent)
145
  expiration_time = datetime.now(timezone.utc) + timedelta(minutes=TOKEN_EXPIRATION_MINUTES)
146
 
 
147
  session_data = {
148
  "user_id": user["id"],
149
  "token": token,
150
- "expires": expiration_time.isoformat(),
151
  "device": user_agent
152
  }
153
 
 
154
  supabase.table("sessions").insert(session_data).execute()
155
 
 
156
  return LoginResponse(
157
  user_id=user["id"],
158
  username=user["username"],
159
  email=user["email"],
160
  access_level=user["access_level"],
161
- date_joined=datetime.fromisoformat(user["date_joined"]),
162
  access_token=token
163
  )
164
 
@@ -186,6 +196,8 @@ async def logout(user_id: str, token: str):
186
  return {"message": "Session forcefully expired"}
187
 
188
 
 
 
189
  @auth_router.get("/validate", response_model=TokenResponse)
190
  async def validate_token(user_id: str, token: str, user_agent: str = Header(...)):
191
  # Query to validate session by user_id, token, and device
@@ -206,14 +218,15 @@ async def validate_token(user_id: str, token: str, user_agent: str = Header(...)
206
 
207
  session = session_query.data[0]
208
 
209
- # Get the current time (UTC)
210
- current_time = datetime.utcnow()
211
 
212
- # Check if token has expired by comparing it with the current time
213
- session_expiry = datetime.fromisoformat(session["expires"].rstrip("Z")) # Removing 'Z' if present
214
-
 
215
  if session_expiry <= current_time:
216
- # Delete session using both user_id and token (composite key)
217
  supabase.table("sessions").delete().eq("user_id", user_id).eq("token", token).execute()
218
  raise HTTPException(
219
  status_code=status.HTTP_401_UNAUTHORIZED, detail="Token expired"
@@ -221,6 +234,7 @@ async def validate_token(user_id: str, token: str, user_agent: str = Header(...)
221
 
222
  return TokenResponse(access_token=token)
223
 
 
224
  @auth_router.get("/search-users", response_model=List[str])
225
  async def search_users(query: str):
226
  users = supabase.table("users").select("username").ilike("username", f"%{query}%").execute()
 
131
  supabase.table("users").insert(user_data).execute()
132
  return {"message": "User created successfully"}
133
 
134
+ from datetime import datetime, timedelta, timezone
135
+
136
  @auth_router.post("/login", response_model=LoginResponse)
137
  async def login(request: LoginRequest, user_agent: str = Header(...)):
138
+ # Query the user based on the username
139
  user_query = supabase.table("users").select("*").eq("username", request.username).execute()
140
 
141
+ # If user not found or password verification fails, raise an error
142
  if not user_query.data or not verify_password(request.password, user_query.data[0]["password"]):
143
  raise HTTPException(
144
  status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid credentials"
145
  )
146
 
147
+ # Extract user details
148
  user = user_query.data[0]
149
+
150
+ # Create a token and calculate expiration time in UTC
151
  token = create_device_token(request.username, user_agent)
152
  expiration_time = datetime.now(timezone.utc) + timedelta(minutes=TOKEN_EXPIRATION_MINUTES)
153
 
154
+ # Prepare session data with the expiration time in ISO 8601 format (UTC)
155
  session_data = {
156
  "user_id": user["id"],
157
  "token": token,
158
+ "expires": expiration_time.isoformat(), # ISO 8601 format ensures the timezone is stored
159
  "device": user_agent
160
  }
161
 
162
+ # Insert the session data into the database
163
  supabase.table("sessions").insert(session_data).execute()
164
 
165
+ # Return the login response with relevant user details
166
  return LoginResponse(
167
  user_id=user["id"],
168
  username=user["username"],
169
  email=user["email"],
170
  access_level=user["access_level"],
171
+ date_joined=datetime.fromisoformat(user["date_joined"]), # Ensure date_joined is parsed correctly
172
  access_token=token
173
  )
174
 
 
196
  return {"message": "Session forcefully expired"}
197
 
198
 
199
+ from datetime import datetime, timezone
200
+
201
  @auth_router.get("/validate", response_model=TokenResponse)
202
  async def validate_token(user_id: str, token: str, user_agent: str = Header(...)):
203
  # Query to validate session by user_id, token, and device
 
218
 
219
  session = session_query.data[0]
220
 
221
+ # Get the current time (UTC) with timezone awareness
222
+ current_time = datetime.now(timezone.utc)
223
 
224
+ # Parse the 'expires' field from the session as an offset-aware datetime
225
+ session_expiry = datetime.fromisoformat(session["expires"])
226
+
227
+ # Check if the token has expired
228
  if session_expiry <= current_time:
229
+ # Delete the session if expired
230
  supabase.table("sessions").delete().eq("user_id", user_id).eq("token", token).execute()
231
  raise HTTPException(
232
  status_code=status.HTTP_401_UNAUTHORIZED, detail="Token expired"
 
234
 
235
  return TokenResponse(access_token=token)
236
 
237
+
238
  @auth_router.get("/search-users", response_model=List[str])
239
  async def search_users(query: str):
240
  users = supabase.table("users").select("username").ilike("username", f"%{query}%").execute()