1- from typing import TypeVar
1+ from typing import List , TypeVar
22
33import requests
44from fastapi import Depends , HTTPException , Request , status
55from fastapi .security import HTTPAuthorizationCredentials
6+ from jwt import InvalidAlgorithmError , InvalidAudienceError
67from lims_utils .auth import GenericUser
78from lims_utils .logging import app_logger
89from lims_utils .models import parse_proposal
2324T = TypeVar ("T" )
2425
2526
26- def _is_cas_token (token : str ):
27- return len (token ) > 2 and token [:2 ] == "AT"
28-
29-
3027def _get_user (token : str ):
31- if _is_cas_token (token ):
32- response = requests .get (
33- Config .auth .endpoint + "/user" ,
34- headers = {"Authorization" : f"Bearer { token } " },
35- )
36-
37- if response .status_code != 200 :
38- raise HTTPException (status_code = response .status_code , detail = response .json ().get ("detail" ))
39- return response .json ()
40- else :
28+ try :
4129 # TODO: replace this once something more permanent becomes available
4230 user = decode_jwt (token , "scaup_general" )
4331 app_id = user .get ("sub" )
@@ -51,6 +39,15 @@ def _get_user(token: str):
5139 "permissions" : user .get ("permissions" ),
5240 "email" : "" ,
5341 }
42+ except (InvalidAudienceError , InvalidAlgorithmError ):
43+ response = requests .get (
44+ Config .auth .endpoint + "/user" ,
45+ headers = {"Authorization" : f"Bearer { token } " },
46+ )
47+
48+ if response .status_code != 200 :
49+ raise HTTPException (status_code = response .status_code , detail = response .json ().get ("detail" ))
50+ return response .json ()
5451
5552
5653class User (GenericUser ):
@@ -67,33 +64,33 @@ def __init__(
6764
6865
6966def _check_perms (data_id : T , endpoint : str , token : str ) -> T :
70- if not _is_cas_token ( token ) :
71- user = _get_user (token )
72- if is_admin (user [ " permissions" ] ):
67+ try :
68+ permissions : List [ str ] = decode_jwt (token , "scaup_general" ). get ( "permissions" , [] )
69+ if is_admin (permissions ):
7370 return data_id
7471
7572 raise HTTPException (status_code = status .HTTP_403_FORBIDDEN , detail = "Provided JWT lacks permissions" )
73+ except (InvalidAudienceError , InvalidAlgorithmError ):
74+ response = requests .get (
75+ "" .join (
76+ [
77+ Config .auth .endpoint ,
78+ "/permission/" ,
79+ endpoint ,
80+ "/" ,
81+ str (data_id ) if endpoint != "proposal" else str (data_id ) + "/inSessions" ,
82+ ]
83+ ),
84+ headers = {"Authorization" : f"Bearer { token } " },
85+ )
86+
87+ if response .status_code != 200 :
88+ detail = response .json ().get ("detail" )
89+ app_logger .error (f"Microauth returned { response .status_code } : { detail } " )
90+
91+ raise HTTPException (status_code = response .status_code , detail = detail )
7692
77- response = requests .get (
78- "" .join (
79- [
80- Config .auth .endpoint ,
81- "/permission/" ,
82- endpoint ,
83- "/" ,
84- str (data_id ) if endpoint != "proposal" else str (data_id ) + "/inSessions" ,
85- ]
86- ),
87- headers = {"Authorization" : f"Bearer { token } " },
88- )
89-
90- if response .status_code != 200 :
91- detail = response .json ().get ("detail" )
92- app_logger .error (f"Microauth returned { response .status_code } : { detail } " )
93-
94- raise HTTPException (status_code = response .status_code , detail = detail )
95-
96- return data_id
93+ return data_id
9794
9895
9996def _generic_table_check (
0 commit comments