Spaces:
Sleeping
Sleeping
Commit
·
05777c4
1
Parent(s):
421675f
login and validate is now utc 0
Browse files
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.
|
| 211 |
|
| 212 |
-
#
|
| 213 |
-
session_expiry = datetime.fromisoformat(session["expires"]
|
| 214 |
-
|
|
|
|
| 215 |
if session_expiry <= current_time:
|
| 216 |
-
# Delete session
|
| 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()
|