Skip to content

Commit 0f304d2

Browse files
author
IndominusByte
committed
improve exception handler
1 parent 1d3325b commit 0f304d2

File tree

2 files changed

+38
-56
lines changed

2 files changed

+38
-56
lines changed

fastapi_jwt_auth/auth_jwt.py

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,7 @@
99
CSRFError,
1010
JWTDecodeError,
1111
RevokedTokenError,
12-
MissingHeaderError,
13-
MissingCookieError,
14-
AccessTokenRequired,
15-
RefreshTokenRequired,
16-
FreshTokenRequired
12+
MissingTokenRequired
1713
)
1814

1915
class AuthJWT(AuthConfig):
@@ -555,7 +551,7 @@ def verify_and_get_jwt_in_cookies(
555551
csrf_token = request.headers.get(self._refresh_csrf_header_name)
556552

557553
if not cookie:
558-
raise MissingCookieError(status_code=401,message="Missing cookie {}".format(cookie_key))
554+
raise MissingTokenRequired(status_code=401,message="Missing cookie {}".format(cookie_key))
559555

560556
if self._cookie_csrf_protect and not csrf_token:
561557
if isinstance(request, WebSocket) or request.method in self._csrf_methods:
@@ -583,7 +579,7 @@ def verify_jwt_optional_in_request(self,token: str) -> None:
583579
if token: self._verifying_token(token)
584580

585581
if token and self.get_raw_jwt(token)['type'] != 'access':
586-
raise AccessTokenRequired(status_code=422,message="Only access tokens are allowed")
582+
raise MissingTokenRequired(status_code=422,message="Only access tokens are allowed")
587583

588584
def verify_jwt_in_request(
589585
self,
@@ -605,21 +601,22 @@ def verify_jwt_in_request(
605601
if token_from not in ['headers','cookies','websocket']:
606602
raise ValueError("token_from must be between 'headers', 'cookies', 'websocket'")
607603

608-
if not token and token_from == 'headers':
609-
raise MissingHeaderError(status_code=401,message="Missing {} Header".format(self._header_name))
604+
if not token:
605+
if token_from == 'headers':
606+
raise MissingTokenRequired(status_code=401,message="Missing {} Header".format(self._header_name))
607+
if token_from == 'websocket':
608+
raise MissingTokenRequired(status_code=1008,message="Missing token from Query or Path")
610609

610+
# verify jwt
611611
issuer = self._decode_issuer if type_token == 'access' else None
612612
self._verifying_token(token,issuer)
613613

614614
if self.get_raw_jwt(token)['type'] != type_token:
615615
msg = "Only {} tokens are allowed".format(type_token)
616-
if type_token == 'access':
617-
raise AccessTokenRequired(status_code=422,message=msg)
618-
if type_token == 'refresh':
619-
raise RefreshTokenRequired(status_code=422,message=msg)
616+
raise MissingTokenRequired(status_code=422,message=msg)
620617

621618
if fresh and not self.get_raw_jwt(token)['fresh']:
622-
raise FreshTokenRequired(status_code=401,message="Fresh token required")
619+
raise MissingTokenRequired(status_code=401,message="Fresh token required")
623620

624621
def _verifying_token(self,encoded_token: str, issuer: Optional[str] = None) -> None:
625622
"""
@@ -665,10 +662,30 @@ def _verified_token(self,encoded_token: str, issuer: Optional[str] = None) -> Di
665662
except Exception as err:
666663
raise JWTDecodeError(status_code=422,message=str(err))
667664

668-
def jwt_required(self) -> None:
665+
def jwt_required(
666+
self,
667+
websocket_auth: Optional[bool] = False,
668+
websocket_from: Optional[str] = "query_path",
669+
token: Optional[str] = None,
670+
websocket: Optional[WebSocket] = None,
671+
csrf_token: Optional[str] = None,
672+
) -> None:
669673
"""
670674
Only access token can access this function
671-
"""
675+
676+
:param websocket_auth:
677+
:param websocket_from:
678+
:param token:
679+
:param websocket:
680+
:param csrf_token:
681+
"""
682+
if websocket_auth:
683+
if websocket_from == "query_path":
684+
self.verify_jwt_in_request(token,'access','websocket')
685+
if websocket_from == "cookies":
686+
self.verify_and_get_jwt_in_cookies('access',websocket,csrf_token)
687+
return
688+
672689
if len(self._token_location) == 2:
673690
if self._token and self.jwt_in_headers:
674691
self.verify_jwt_in_request(self._token,'access','headers')

fastapi_jwt_auth/exceptions.py

Lines changed: 5 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,7 @@ class AuthJWTException(Exception):
66

77
class InvalidHeaderError(AuthJWTException):
88
"""
9-
An error getting header information from a request
10-
"""
11-
def __init__(self,status_code: int, message: str):
12-
self.status_code = status_code
13-
self.message = message
14-
15-
class MissingHeaderError(AuthJWTException):
16-
"""
17-
Error raised when <HeaderName> not found in the header
18-
"""
19-
def __init__(self,status_code: int, message: str):
20-
self.status_code = status_code
21-
self.message = message
22-
23-
class MissingCookieError(AuthJWTException):
24-
"""
25-
Error raised when token not found in cookie
9+
An error getting jwt in header or jwt header information from a request
2610
"""
2711
def __init__(self,status_code: int, message: str):
2812
self.status_code = status_code
@@ -44,36 +28,17 @@ def __init__(self,status_code: int, message: str):
4428
self.status_code = status_code
4529
self.message = message
4630

47-
class RevokedTokenError(AuthJWTException):
48-
"""
49-
Error raised when a revoked token attempt to access a protected endpoint
50-
"""
51-
def __init__(self,status_code: int, message: str):
52-
self.status_code = status_code
53-
self.message = message
54-
55-
class AccessTokenRequired(AuthJWTException):
56-
"""
57-
Error raised when a valid, non-access JWT attempt to access an endpoint
58-
protected by jwt_required, jwt_optional, fresh_jwt_required
59-
"""
60-
def __init__(self,status_code: int, message: str):
61-
self.status_code = status_code
62-
self.message = message
63-
64-
class RefreshTokenRequired(AuthJWTException):
31+
class MissingTokenRequired(AuthJWTException):
6532
"""
66-
Error raised when a valid, non-refresh JWT attempt to access an endpoint
67-
protected by jwt_refresh_token_required
33+
Error raised when token not found or invalid type
6834
"""
6935
def __init__(self,status_code: int, message: str):
7036
self.status_code = status_code
7137
self.message = message
7238

73-
class FreshTokenRequired(AuthJWTException):
39+
class RevokedTokenError(AuthJWTException):
7440
"""
75-
Error raised when a valid, non-fresh JWT attempt to access an endpoint
76-
protected by fresh_jwt_required
41+
Error raised when a revoked token attempt to access a protected endpoint
7742
"""
7843
def __init__(self,status_code: int, message: str):
7944
self.status_code = status_code

0 commit comments

Comments
 (0)