Skip to content

Commit 83b9615

Browse files
authored
Merge pull request #21 from UpstreamDataInc/dev_session
Improve session handling
2 parents 6f86207 + d75ad07 commit 83b9615

File tree

3 files changed

+96
-98
lines changed

3 files changed

+96
-98
lines changed

goosebit/auth/__init__.py

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
from fastapi.requests import Request
55
from fastapi.security import SecurityScopes
66
from fastapi.websockets import WebSocket
7-
from jose import jwt
7+
from joserfc import jwt
8+
from joserfc.errors import BadSignatureError
89

910
from goosebit.settings import PWD_CXT, SECRET, USERS
1011

@@ -29,46 +30,49 @@ async def authenticate_user(request: Request):
2930
return user
3031

3132

32-
sessions = {}
33-
34-
35-
def create_session(email: str) -> str:
36-
token = jwt.encode({"email": email}, SECRET)
37-
sessions[token] = email
38-
return token
33+
def create_session(username: str) -> str:
34+
return jwt.encode(
35+
header={"alg": "HS256"}, claims={"username": username}, key=SECRET
36+
)
3937

4038

4139
def authenticate_session(request: Request):
4240
session_id = request.cookies.get("session_id")
43-
if session_id is None or session_id not in sessions:
41+
if session_id is None:
4442
raise HTTPException(
4543
status_code=302,
4644
headers={"location": str(request.url_for("login"))},
4745
detail="Invalid session ID",
4846
)
4947
user = get_user_from_session(session_id)
48+
if user is None:
49+
raise HTTPException(
50+
status_code=302,
51+
headers={"location": str(request.url_for("login"))},
52+
detail="Invalid username",
53+
)
5054
return user
5155

5256

5357
def authenticate_api_session(request: Request):
5458
session_id = request.cookies.get("session_id")
55-
if session_id is None or session_id not in sessions:
56-
raise HTTPException(status_code=401, detail="Not logged in")
5759
user = get_user_from_session(session_id)
60+
if user is None:
61+
raise HTTPException(status_code=401, detail="Not logged in")
5862
return user
5963

6064

6165
def authenticate_ws_session(websocket: WebSocket):
6266
session_id = websocket.cookies.get("session_id")
63-
if session_id is None or session_id not in sessions:
64-
raise HTTPException(status_code=401, detail="Not logged in")
6567
user = get_user_from_session(session_id)
68+
if user is None:
69+
raise HTTPException(status_code=401, detail="Not logged in")
6670
return user
6771

6872

6973
def auto_redirect(request: Request):
7074
session_id = request.cookies.get("session_id")
71-
if session_id is None or session_id not in sessions:
75+
if get_user_from_session(session_id) is None:
7276
return request
7377
raise HTTPException(
7478
status_code=302,
@@ -78,16 +82,20 @@ def auto_redirect(request: Request):
7882

7983

8084
def get_user_from_session(session_id: str):
81-
for username in USERS:
82-
if username == sessions.get(session_id):
83-
return username
85+
if session_id is None:
86+
return
87+
try:
88+
session_data = jwt.decode(session_id, SECRET)
89+
return session_data.claims["username"]
90+
except (BadSignatureError, LookupError):
91+
pass
8492

8593

8694
def get_current_user(request: Request):
8795
session_id = request.cookies.get("session_id")
88-
if session_id is None or session_id not in sessions:
89-
return None
9096
user = get_user_from_session(session_id)
97+
if user is None:
98+
return None
9199
return USERS[user]
92100

93101

poetry.lock

Lines changed: 68 additions & 78 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ fastapi = {extras = ["uvicorn"], version = "^0.111.0"}
1111
python-multipart = "^0.0.9"
1212
jinja2 = "^3.1.4"
1313
itsdangerous = "^2.2.0"
14-
python-jose = "^3.3.0"
1514
tortoise-orm = "^0.21.4"
1615
aerich = "^0.7.2"
1716
aiofiles = "^24.1.0"
1817
websockets = "^12.0"
1918
argon2-cffi = "^23.1.0"
19+
joserfc = "^1.0.0"
2020
semver = "^3.0.2"
2121

2222
[tool.poetry.group.dev.dependencies]

0 commit comments

Comments
 (0)