auth
swadhinbiswas committed 2 years ago
5b81fa9
1 parent aa0cc75
commit 5b81fa9
2 files changed
+42 -10
Showing 2 changed files+42-10
▼backend/auth/dependency.py
+21-0
| @@ -0,0 +1,21 @@ | ||
1 | +from typing import List | |
2 | +from auth_hader import get_bearer_token | |
3 | +from json_web_token import JsontoWebToken | |
4 | +from expreance import PermissionDeniedException | |
5 | +from fastapi import Depends | |
6 | + | |
7 | +def valid_token(token: str = Depends(get_bearer_token)): | |
8 | + return JsontoWebToken(token).validate() | |
9 | + | |
10 | +class PermissionValidation: | |
11 | + def __init__(self,permission:List[str]): | |
12 | + self.permission = permission | |
13 | + | |
14 | + def __call__(self,token: str = Depends(valid_token)): | |
15 | + token_permission = token.get("permissions") | |
16 | + token_permission = set(token_permission) | |
17 | + permission = set(self.permission) | |
18 | + if not permission.issubset(token_permission): | |
19 | + raise PermissionDeniedException | |
20 | + | |
21 | + | |
0 | 22 | |
▼backend/auth/json_web_token.py
+21-10
| @@ -1,7 +1,5 @@ | ||
1 | 1 | from dataclasses import dataclass |
2 | 2 | import jwt |
3 | -from matplotlib.pylab import f | |
4 | -from Gellary.backend import auth | |
5 | 3 | from settings import setting |
6 | 4 | from expreance import BadCredentialsException,UnableCredentialsException |
7 | 5 | |
| @@ -11,14 +9,27 @@ class JsontoWebToken: | ||
11 | 9 | auth0_domain: str=f"{setting.AUTH0_DOMAIN}/" |
12 | 10 | auth0_audience: str=setting.AUTH0_AUDIENCE |
13 | 11 | algorithm: str=setting.ALGORITHM |
14 | - jwks=f"{auth0_domain}.well-known/jwks.json" | |
12 | + jwt_url=f"{auth0_domain}.well-known/jwks.json" | |
15 | 13 | |
16 | 14 | def verify_jwt(self): |
17 | 15 | try: |
18 | - unverified_header = jwt.get_unverified_header(self.jwt_access_token) | |
19 | - except jwt.JWTError: | |
20 | - raise BadCredentialsException | |
21 | - if unverified_header["alg"] != "RS256": | |
22 | - raise UnableCredentialsException | |
23 | - return unverified_header | |
24 | - | |
16 | + jwt_client=jwt.PyJWKClient(jwks_uri=self.jwt_url) | |
17 | + jwt_signingkey=jwt_client.get_signing_key_from_jwt(self.jwt_access_token).key | |
18 | + payload=jwt.decode(self.jwt_access_token, | |
19 | + jwt_signingkey, | |
20 | + algorithms=[self.algorithm], | |
21 | + audience=self.auth0_audience, | |
22 | + issuer=self.auth0_domain) | |
23 | + | |
24 | + except jwt.exceptions.PyJWKClinetError: | |
25 | + raise UnableCredentialsException | |
26 | + except jwt.exceptions.PyJWTError: | |
27 | + raise BadCredentialsException | |
28 | + except jwt.exceptions.InvalidTokenError: | |
29 | + raise BadCredentialsException | |
30 | + | |
31 | + return payload | |
32 | + | |
33 | + def validate(self): | |
34 | + return self.verify_jwt() | |
35 | +# | |
25 | 36 | |