Skip to content

Commit c996540

Browse files
committed
socket auth
1 parent bc33740 commit c996540

File tree

7 files changed

+42
-18
lines changed

7 files changed

+42
-18
lines changed

backend/app/fastapi.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
from alembic.config import Config as AlembicConfig
1313
from alembic import command as alembic_command
1414

15-
from app.services.ws_broadcast import register_ws_routes, redis_listener
15+
from app.websockets import register_ws_routes, redis_listener
1616
from app.config import get_config
17-
from backend.app.utils.sentry import initialize_sentry
17+
from app.utils.sentry import initialize_sentry
1818

1919
def lifespan(app: FastAPI):
2020
initialize_sentry()

backend/app/models/frame.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from app.models.apps import get_app_configs
1212
from app.models.settings import get_settings_dict
1313
from app.utils.token import secure_token
14-
from app.services.ws_broadcast import publish_message
14+
from app.websockets import publish_message
1515

1616

1717
# NB! Update frontend/src/types.tsx if you change this

backend/app/models/log.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from app.database import Base
99
from sqlalchemy import Integer, String, DateTime, ForeignKey, Text, func
1010
from sqlalchemy.orm import relationship, backref, Session, mapped_column
11-
from app.services.ws_broadcast import publish_message
11+
from app.websockets import publish_message
1212

1313
class Log(Base):
1414
__tablename__ = 'log'

backend/app/models/metrics.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from sqlalchemy import Integer, String, ForeignKey, DateTime, func
44
from app.database import Base
55
from sqlalchemy.orm import relationship, backref, Session, mapped_column
6-
from app.services.ws_broadcast import publish_message
6+
from app.websockets import publish_message
77

88
class Metrics(Base):
99
__tablename__ = 'metrics'

backend/app/services/ws_broadcast.py renamed to backend/app/websockets.py

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
import asyncio
22
import json
33
import uuid
4+
from jose import jwt, JWTError
45
from typing import List
56
from redis.asyncio import from_url as create_redis
6-
from fastapi import WebSocket, WebSocketDisconnect
7+
from fastapi import WebSocket, WebSocketDisconnect, Depends
8+
from sqlalchemy.orm import Session
9+
from app.database import get_db
710

811
from app.config import get_config
12+
from app.models.user import User
913

1014
redis_pub = None
1115
redis_sub = None
@@ -82,17 +86,35 @@ async def publish_message(event: str, data: dict):
8286

8387
def register_ws_routes(app):
8488
@app.websocket("/ws")
85-
async def websocket_endpoint(websocket: WebSocket):
89+
async def websocket_endpoint(websocket: WebSocket, db: Session = Depends(get_db)):
90+
token = websocket.query_params.get('token')
91+
if not token:
92+
await websocket.close(code=1008, reason="Missing token")
93+
return
94+
95+
try:
96+
from app.api.auth import ALGORITHM, SECRET_KEY
97+
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
98+
user_email = payload.get("sub")
99+
if not user_email:
100+
raise ValueError("Invalid token")
101+
except JWTError:
102+
await websocket.close(code=1008, reason="Invalid token")
103+
return
104+
105+
user = db.query(User).filter(User.email == user_email).first()
106+
if user is None:
107+
await websocket.close(code=1008, reason="User not found")
108+
return
109+
86110
await manager.connect(websocket)
87111
try:
88112
while True:
89113
data = await websocket.receive_text()
90-
# Handle incoming messages
91-
await manager.send_personal_message(f"You said: {data}", websocket)
114+
# Optionally handle incoming messages
115+
await manager.send_personal_message("You said: " + data, websocket)
92116
except WebSocketDisconnect:
93117
await manager.disconnect(websocket)
94-
except Exception as e:
95-
print(f"Error: {e}")
96-
await manager.disconnect(websocket)
118+
97119

98120
return manager

frontend/src/scenes/socketLogic.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export const socketLogic = kea<socketLogicType>([
1414
newMetrics: (metrics: Record<string, any>) => ({ metrics }),
1515
}),
1616
afterMount(({ actions, cache }) => {
17-
cache.ws = new WebSocket('/ws')
17+
cache.ws = new WebSocket('/ws?token=' + localStorage.getItem('token'))
1818
cache.ws.onopen = function (event: any) {
1919
console.log('🔵 Connected to the WebSocket server.')
2020
}

backend/gpt.sh renamed to gpt.sh

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ OUTPUT="gpt.txt"
77

88
# Define the patterns you want to collect files from:
99
patterns=(
10-
"app/*.py"
11-
"app/schemas/*.py"
12-
"app/models/*.py"
13-
"app/api/*.py"
14-
"app/services/*.py"
10+
"backend/app/*.py"
11+
"backend/app/schemas/*.py"
12+
"backend/app/models/*.py"
13+
"backend/app/api/*.py"
14+
"backend/app/services/*.py"
15+
"backend/app/services/ws_broadcast.py"
16+
"frontend/src/scenes/socketLogic.tsx"
1517
)
1618

1719
for pattern in "${patterns[@]}"; do

0 commit comments

Comments
 (0)