py.lib.aw_web_tools
2024-11-09
Parent:b9fd029be707
py.lib.aw_web_tools/src/aw_web_tools/id_helper.py
.. 1.202411.2 + Поддержка Authelia
1.1 --- a/src/aw_web_tools/id_helper.py Sun Nov 03 19:25:24 2024 +0300 1.2 +++ b/src/aw_web_tools/id_helper.py Sat Nov 09 16:45:06 2024 +0300 1.3 @@ -5,10 +5,12 @@ 1.4 import bottle 1.5 from string import ascii_letters, digits 1.6 from typing import Optional, Dict, Iterable, Any 1.7 + 1.8 from . import btle_tools as tools 1.9 from . import Error 1.10 from . import jwt_helper 1.11 from .cookie import Cookie 1.12 +from .authelia_helper import AHAuthError, AutheliaHelper, AHUser 1.13 1.14 1.15 SESSION_TIMEOUT = 86400 # Продолжительность сессии по умолчанию. 1.16 @@ -229,10 +231,12 @@ 1.17 def __init__(self, 1.18 app_name: str, 1.19 sign_secret: str, 1.20 + authelia_helper: Optional[AutheliaHelper] = None, 1.21 sess_timeout: int = SESSION_TIMEOUT 1.22 ): 1.23 """\ 1.24 :param app_name: Имя приложения. Допускаются цифры символы латиницы и знак ``-`` 1.25 + :param authelia_helper: Объект AutheliaHelper с описанием системы аутентификации, если используем Authelia 1.26 :param sign_secret: Секрет, которым будет подписываться JWT. 1.27 :param sess_timeout: Время жизни сессии пользователя. 1.28 """ 1.29 @@ -244,6 +248,7 @@ 1.30 self.cookie_name = f'X-ID-{self.app_name}' 1.31 self.sess_timeout = sess_timeout 1.32 self.jwt_helper = jwt.JWTHelper(sign_secret) 1.33 + self.ah = authelia_helper 1.34 1.35 # Свойства необходимые для работы в качестве плагина Bottle 1.36 self.name = 'IDHelper' 1.37 @@ -300,24 +305,39 @@ 1.38 """ 1.39 sid = tools.get_cookie(self.cookie_name) 1.40 if sid is None: 1.41 - raise IDNotFound() 1.42 + if self.ah is None: 1.43 + IDNotFound() 1.44 1.45 - try: 1.46 - uid_raw = self.jwt_helper.decode(sid, check_timeout=True) 1.47 - uid = UID.from_dict(uid_raw) 1.48 + else: 1.49 + try: 1.50 + _ahuser = self.ah(request=request) 1.51 + uid = UID(uname=_ahuser.uname, acc_tags=_ahuser.groups, user_meta={ 1.52 + 'email': _ahuser.email, 1.53 + 'name': _ahuser.name, 1.54 + }) 1.55 1.56 - fp = tools.get_session_fingerprint(uid.get_fp_id(), request=request) 1.57 + uid.to_env(request=request) 1.58 + 1.59 + except AHAuthError: 1.60 + raise IDNotFound() 1.61 1.62 - if fp != uid_raw.get('fp'): 1.63 - raise IDCheckError('Проверка подписи сессии не прошла') 1.64 + else: 1.65 + try: 1.66 + uid_raw = self.jwt_helper.decode(sid, check_timeout=True) 1.67 + uid = UID.from_dict(uid_raw) 1.68 1.69 - uid.to_env(request=request) 1.70 + fp = tools.get_session_fingerprint(uid.get_fp_id(), request=request) 1.71 1.72 - except (jwt.JWTAuthError, UIDError) as e: 1.73 - raise IDCheckError(f'Ошибка проверки ID: {e}') 1.74 + if fp != uid_raw.get('fp'): 1.75 + raise IDCheckError('Проверка подписи сессии не прошла') 1.76 + 1.77 + uid.to_env(request=request) 1.78 1.79 - except (jwt.JWTError, IDError) as e: 1.80 - raise IDError(f'Ошибка в обработке ID запроса: {e}') 1.81 + except (jwt.JWTAuthError, UIDError) as e: 1.82 + raise IDCheckError(f'Ошибка проверки ID: {e}') 1.83 + 1.84 + except (jwt.JWTError, IDError) as e: 1.85 + raise IDError(f'Ошибка в обработке ID запроса: {e}') 1.86 1.87 def need_id(self): 1.88 """\