Skip to content

Commit 74032e1

Browse files
committed
Ability to configure different auth routes for instrument server and frontend routers
1 parent 2d3e030 commit 74032e1

File tree

6 files changed

+48
-14
lines changed

6 files changed

+48
-14
lines changed

src/murfey/server/api/auth.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ async def __call__(self, request: Request):
7070
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
7171
else:
7272
oauth2_scheme = CookieScheme(cookie_key=security_config.cookie_key)
73+
if security_config.instrument_auth_type == "token":
74+
instrument_oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
75+
else:
76+
instrument_oauth2_scheme = lambda *args, **kwargs: None
7377
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
7478

7579
instrument_server_tokens: Dict[float, dict] = {}
@@ -170,7 +174,35 @@ async def validate_token(token: Annotated[str, Depends(oauth2_scheme)]):
170174
)
171175
async with aiohttp.ClientSession(cookies=cookies) as session:
172176
async with session.get(
173-
f"{auth_url}{url_path_for('auth.router', 'simple_token_validation')}",
177+
auth_url,
178+
headers=headers,
179+
) as response:
180+
success = response.status == 200
181+
validation_outcome = await response.json()
182+
if not (success and validation_outcome.get("valid")):
183+
raise JWTError
184+
except JWTError:
185+
raise HTTPException(
186+
status_code=status.HTTP_401_UNAUTHORIZED,
187+
detail="Could not validate credentials",
188+
headers={"WWW-Authenticate": "Bearer"},
189+
)
190+
return None
191+
192+
193+
async def validate_instrument_token(
194+
token: Annotated[str, Depends(instrument_oauth2_scheme)]
195+
):
196+
try:
197+
if security_config.instrument_auth_url:
198+
async with aiohttp.ClientSession() as session:
199+
headers = (
200+
{}
201+
if not security_config.instrument_auth_type
202+
else {"Authorization": f"Bearer {token}"}
203+
)
204+
async with session.get(
205+
security_config.instrument_auth_url,
174206
headers=headers,
175207
) as response:
176208
success = response.status == 200

src/murfey/server/api/file_manip.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from sqlmodel import select
99
from werkzeug.utils import secure_filename
1010

11-
from murfey.server.api.auth import MurfeySessionID, validate_token
11+
from murfey.server.api.auth import MurfeySessionID, validate_instrument_token
1212
from murfey.server.gain import Camera, prepare_eer_gain, prepare_gain
1313
from murfey.server.murfey_db import murfey_db
1414
from murfey.util import sanitise, secure_path
@@ -20,7 +20,7 @@
2020

2121
router = APIRouter(
2222
prefix="/file_manipulation",
23-
dependencies=[Depends(validate_token)],
23+
dependencies=[Depends(validate_instrument_token)],
2424
tags=["File Manipulation"],
2525
)
2626

src/murfey/server/api/prometheus.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from sqlmodel import select
99

1010
import murfey.server.prometheus as prom
11-
from murfey.server.api.auth import validate_token
11+
from murfey.server.api.auth import validate_instrument_token
1212
from murfey.server.murfey_db import murfey_db
1313
from murfey.util import sanitise
1414
from murfey.util.db import RsyncInstance
@@ -18,7 +18,7 @@
1818

1919
router = APIRouter(
2020
prefix="/prometheus",
21-
dependencies=[Depends(validate_token)],
21+
dependencies=[Depends(validate_instrument_token)],
2222
tags=["Prometheus"],
2323
)
2424

src/murfey/server/api/session_control.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
import murfey.server.prometheus as prom
1414
from murfey.server import _transport_object
15-
from murfey.server.api.auth import MurfeySessionID, validate_token
15+
from murfey.server.api.auth import MurfeySessionID, validate_instrument_token
1616
from murfey.server.api.shared import get_foil_hole as _get_foil_hole
1717
from murfey.server.api.shared import (
1818
get_foil_holes_from_grid_square as _get_foil_holes_from_grid_square,
@@ -60,7 +60,7 @@
6060

6161
router = APIRouter(
6262
prefix="/session_control",
63-
dependencies=[Depends(validate_token)],
63+
dependencies=[Depends(validate_instrument_token)],
6464
tags=["Session Control: General"],
6565
)
6666

@@ -297,7 +297,7 @@ def delete_rsyncer(session_id: int, source: Path, db=murfey_db):
297297

298298
spa_router = APIRouter(
299299
prefix="/session_control/spa",
300-
dependencies=[Depends(validate_token)],
300+
dependencies=[Depends(validate_instrument_token)],
301301
tags=["Session Control: SPA"],
302302
)
303303

@@ -355,7 +355,7 @@ def register_foil_hole(
355355

356356
correlative_router = APIRouter(
357357
prefix="/session_control/correlative",
358-
dependencies=[Depends(validate_token)],
358+
dependencies=[Depends(validate_instrument_token)],
359359
tags=["Session Control: Correlative Imaging"],
360360
)
361361

src/murfey/server/api/workflow.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
import murfey.server.prometheus as prom
2828
from murfey.server import _transport_object
29-
from murfey.server.api.auth import MurfeySessionID, validate_token
29+
from murfey.server.api.auth import MurfeySessionID, validate_instrument_token
3030
from murfey.server.api.spa import _cryolo_model_path
3131
from murfey.server.feedback import (
3232
_murfey_id,
@@ -65,7 +65,7 @@
6565

6666
router = APIRouter(
6767
prefix="/workflow",
68-
dependencies=[Depends(validate_token)],
68+
dependencies=[Depends(validate_instrument_token)],
6969
tags=["Workflows: General"],
7070
)
7171

@@ -285,7 +285,7 @@ def register_proc(
285285

286286
spa_router = APIRouter(
287287
prefix="/workflow/spa",
288-
dependencies=[Depends(validate_token)],
288+
dependencies=[Depends(validate_instrument_token)],
289289
tags=["Workflows: SPA"],
290290
)
291291

@@ -514,7 +514,7 @@ async def request_spa_preprocessing(
514514

515515
tomo_router = APIRouter(
516516
prefix="/workflow/tomo",
517-
dependencies=[Depends(validate_token)],
517+
dependencies=[Depends(validate_instrument_token)],
518518
tags=["Workflows: CryoET"],
519519
)
520520

@@ -912,7 +912,7 @@ def _add_tilt():
912912

913913
correlative_router = APIRouter(
914914
prefix="/workflow/correlative",
915-
dependencies=[Depends(validate_token)],
915+
dependencies=[Depends(validate_instrument_token)],
916916
tags=["Workflows: Correlative Imaging"],
917917
)
918918

src/murfey/util/config.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ class Security(BaseModel):
127127
auth_key: str = ""
128128
auth_type: Literal["password", "cookie"] = "password"
129129
auth_url: str = ""
130+
instrument_auth_type: Literal["token", ""] = "token"
131+
instrument_auth_url: str = ""
130132
cookie_key: str = ""
131133
session_validation: str = ""
132134
session_token_timeout: Optional[int] = None

0 commit comments

Comments
 (0)