Skip to content

Commit c5690b8

Browse files
committed
add device code authorization endpoint and CORS middleware
1 parent 8f44a43 commit c5690b8

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

backend/api/server_fastapi_router.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,19 @@
55

66
import modal
77
from fastapi import APIRouter, File, Form, HTTPException, UploadFile
8+
from pydantic import BaseModel
89

910
logger = logging.getLogger(__name__)
1011

1112

13+
class AuthorizeDeviceRequest(BaseModel):
14+
"""Request body for device code authorization."""
15+
user_code: str
16+
user_id: str
17+
id_token: str
18+
refresh_token: str
19+
20+
1221
class ServerFastAPIRouter:
1322
"""
1423
FastAPI router for the Server service.
@@ -93,6 +102,7 @@ def _register_routes(self):
93102
self.router.add_api_route("/cache/clear", self.clear_cache, methods=["POST"])
94103
self.router.add_api_route("/auth/device/code", self.request_device_code, methods=["POST"])
95104
self.router.add_api_route("/auth/device/poll", self.poll_device_code, methods=["POST"])
105+
self.router.add_api_route("/auth/device/authorize", self.authorize_device_code, methods=["POST"])
96106

97107
async def health(self):
98108
"""
@@ -355,3 +365,38 @@ async def poll_device_code(self, device_code: str):
355365
except Exception as e:
356366
logger.error(f"[Device Poll] Error polling device code: {e}")
357367
raise HTTPException(status_code=500, detail=str(e))
368+
369+
async def authorize_device_code(self, request: AuthorizeDeviceRequest):
370+
try:
371+
# Look up device_code by user_code
372+
device_code = self.server_instance.auth_connector.get_device_code_by_user_code(request.user_code)
373+
374+
if device_code is None:
375+
raise HTTPException(
376+
status_code=404,
377+
detail="User code not found or expired"
378+
)
379+
380+
# Mark device code as authorized with user tokens
381+
success = self.server_instance.auth_connector.set_device_code_authorized(
382+
device_code=device_code,
383+
user_id=request.user_id,
384+
id_token=request.id_token,
385+
refresh_token=request.refresh_token
386+
)
387+
388+
if not success:
389+
raise HTTPException(
390+
status_code=500,
391+
detail="Failed to authorize device code"
392+
)
393+
394+
logger.info(f"[Device Authorize] User code {request.user_code} authorized for user {request.user_id}")
395+
396+
return {"status": "success"}
397+
398+
except HTTPException:
399+
raise
400+
except Exception as e:
401+
logger.error(f"[Device Authorize] Error authorizing device code: {e}")
402+
raise HTTPException(status_code=500, detail=str(e))

backend/services/http_server.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,19 @@ def create_fastapi_app(self, processing_service_cls=None):
7373
"""
7474
from api import ServerFastAPIRouter
7575
from fastapi import FastAPI
76+
from fastapi.middleware.cors import CORSMiddleware
7677

7778
self.fastapi_app = FastAPI(title="Clipabit Server")
79+
80+
# Add CORS middleware for testing
81+
self.fastapi_app.add_middleware(
82+
CORSMiddleware,
83+
allow_origins=["*"],
84+
allow_credentials=True,
85+
allow_methods=["*"],
86+
allow_headers=["*"],
87+
)
88+
7889
api_router = ServerFastAPIRouter(
7990
server_instance=self,
8091
is_file_change_enabled=self.is_file_change_enabled,

0 commit comments

Comments
 (0)