Skip to content
18 changes: 17 additions & 1 deletion auth_backend/auth_method/oauth.py
Original file line number Diff line number Diff line change
@@ -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

Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion auth_backend/auth_method/outer.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

а ты проверял, что там реально так нужно? странно что не просто id

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

да, там в структуре у request_user поле id это просто обычный айдишник, который ничего не значит, а user_id отдельное поле связанное с таблицей юзера. Плюс я это протестил и работает только мой вариант

raise HTTPException(status_code=HTTP_403_FORBIDDEN, detail="Not authorized")
username = await cls.__get_username(user_id)
if not username:
Expand Down
17 changes: 15 additions & 2 deletions auth_backend/auth_plugins/lkmsu.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down
1 change: 0 additions & 1 deletion auth_backend/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

from annotated_types import Gt
from pydantic import PostgresDsn
from pydantic.types import PathType
from pydantic_settings import BaseSettings, SettingsConfigDict


Expand Down