py.lib.aw_web_tools

Yohn Y. 2024-11-09 Parent:b9fd029be707

9:9c734271dcf2 Go to Latest

py.lib.aw_web_tools/src/aw_web_tools/id_helper.py

.. 1.202411.2 + Поддержка Authelia

History
     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          """\