diff --git a/auth_backend/auth_method/oauth.py b/auth_backend/auth_method/oauth.py index 961e2767..d65ab0d1 100644 --- a/auth_backend/auth_method/oauth.py +++ b/auth_backend/auth_method/oauth.py @@ -1,13 +1,16 @@ import logging from abc import abstractmethod +from event_schema.auth import UserInfo, UserLogin, UserLoginKey from fastapi import Depends +from fastapi.background import BackgroundTasks from fastapi_sqlalchemy import db from sqlalchemy.orm import Session as DbSession from auth_backend.auth_method import AUTH_METHODS, LoginableMixin from auth_backend.base import Base from auth_backend.exceptions import LastAuthMethodDelete +from auth_backend.kafka.kafka import get_kafka_producer from auth_backend.models.db import AuthMethod, User, UserSession from auth_backend.utils.security import UnionAuth @@ -44,13 +47,26 @@ async def _auth_url(*args, **kwargs) -> UrlSchema: raise NotImplementedError() @classmethod - async def _unregister(cls, user_session: UserSession = Depends(UnionAuth(scopes=[], auto_error=True))): + async def _unregister( + cls, + background_tasks: BackgroundTasks, + user_session: UserSession = Depends(UnionAuth(scopes=[], auto_error=True)), + ): """Отключает для пользователя метод входа""" old_user = {"user_id": user_session.user.id} new_user = {"user_id": user_session.user.id} old_user_params = await cls._delete_auth_methods(user_session.user, db_session=db.session) old_user[cls.get_name()] = old_user_params await AuthPluginMeta.user_updated(new_user, old_user) + user_data = {} + userdata = await cls._convert_data_to_userdata_format(user_data) + items_login = [UserInfo(category=item.category, param=item.param, value=None) for item in userdata.items] + background_tasks.add_task( + get_kafka_producer().produce, + cls.settings.KAFKA_USER_LOGIN_TOPIC_NAME, + UserLoginKey(user_id=user_session.user.id), + UserLogin(source=cls.get_name(), items=items_login), + ) return None @classmethod diff --git a/auth_backend/auth_method/outer.py b/auth_backend/auth_method/outer.py index 26b1ab02..00a46975 100644 --- a/auth_backend/auth_method/outer.py +++ b/auth_backend/auth_method/outer.py @@ -165,7 +165,7 @@ async def _get_link( Получить данные может администратор или сам пользователь """ - if cls.get_scope() not in (s.name for s in request_user.scopes) and request_user.id != user_id: + if cls.get_scope() not in (s.name for s in request_user.scopes) and request_user.user_id != user_id: raise HTTPException(status_code=HTTP_403_FORBIDDEN, detail="Not authorized") username = await cls.__get_username(user_id) if not username: diff --git a/auth_backend/auth_plugins/lkmsu.py b/auth_backend/auth_plugins/lkmsu.py index 4b170daa..a8fca628 100644 --- a/auth_backend/auth_plugins/lkmsu.py +++ b/auth_backend/auth_plugins/lkmsu.py @@ -4,7 +4,7 @@ import aiohttp import jwt -from event_schema.auth import UserLogin +from event_schema.auth import UserInfo, UserLogin, UserLoginKey from fastapi import Depends from fastapi_sqlalchemy import db from pydantic import BaseModel, Field @@ -174,7 +174,11 @@ async def _login( ) @classmethod - async def _unregister(cls, user_session: UserSession = Depends(UnionAuth(scopes=[], auto_error=True))): + async def _unregister( + cls, + background_tasks: BackgroundTasks, + user_session: UserSession = Depends(UnionAuth(scopes=[], auto_error=True)), + ): """Отключает для пользователя метод входа""" user: User = user_session.user verified_group_id = DynamicOption.get("verified_group_id", session=db.session).value @@ -198,6 +202,15 @@ async def _unregister(cls, user_session: UserSession = Depends(UnionAuth(scopes= old_user_params = await cls._delete_auth_methods(user_session.user, db_session=db.session) old_user[cls.get_name()] = old_user_params await AuthPluginMeta.user_updated(new_user, old_user) + user_data = {} + userdata = await cls._convert_data_to_userdata_format(user_data) + items_login = [UserInfo(category=item.category, param=item.param, value=None) for item in userdata.items] + background_tasks.add_task( + get_kafka_producer().produce, + cls.settings.KAFKA_USER_LOGIN_TOPIC_NAME, + UserLoginKey(user_id=user_session.user.id), + UserLogin(source=cls.get_name(), items=items_login), + ) return None @classmethod diff --git a/auth_backend/settings.py b/auth_backend/settings.py index ff47cf5e..04e6d619 100644 --- a/auth_backend/settings.py +++ b/auth_backend/settings.py @@ -7,7 +7,6 @@ from annotated_types import Gt from pydantic import PostgresDsn -from pydantic.types import PathType from pydantic_settings import BaseSettings, SettingsConfigDict