61 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import httpx
 | 
						|
import asyncio
 | 
						|
from app.core import config
 | 
						|
from app.core.database import add_session
 | 
						|
 | 
						|
async def login(login, password):
 | 
						|
    """
 | 
						|
    Отправляет запрос на аутентификацию и в случае успеха сохраняет сессию.
 | 
						|
 | 
						|
    :param login: Логин пользователя
 | 
						|
    :param password: Пароль пользователя
 | 
						|
    :return: Кортеж (успех: bool, сообщение: str)
 | 
						|
    """
 | 
						|
    url = f"{config.BASE_URL}/v1/auth/login"
 | 
						|
    
 | 
						|
    try:
 | 
						|
        async with httpx.AsyncClient(http2=True) as client:
 | 
						|
            response = await client.post(url, json={"login": login, "password": password})
 | 
						|
 | 
						|
            if response.status_code == 200:
 | 
						|
                data = response.json()
 | 
						|
                if data.get("status") == "fine":
 | 
						|
                    token_data = data["data"]
 | 
						|
                    add_session(
 | 
						|
                        login=login,
 | 
						|
                        access_token=token_data["access_token"],
 | 
						|
                        refresh_token=token_data["refresh_token"]
 | 
						|
                    )
 | 
						|
                    return True, "Успешный вход"
 | 
						|
                else:
 | 
						|
                    return False, data.get("detail", "Неизвестная ошибка ответа")
 | 
						|
            
 | 
						|
            elif response.status_code in [401, 403]:
 | 
						|
                error_data = response.json()
 | 
						|
                return False, error_data.get("detail", "Неверный логин или пароль")
 | 
						|
            
 | 
						|
            elif response.status_code == 422:
 | 
						|
                # Ошибка валидации Pydantic
 | 
						|
                error_data = response.json()
 | 
						|
                # Можно будет позже реализовать более детальный разбор ошибок
 | 
						|
                return False, error_data.get("detail", "Некорректные данные для входа")
 | 
						|
 | 
						|
            else:
 | 
						|
                return False, f"Ошибка сервера: {response.status_code}"
 | 
						|
 | 
						|
    except httpx.RequestError as e:
 | 
						|
        # Ошибка сети, таймаут и т.д.
 | 
						|
        return False, f"Ошибка сети: {e}"
 | 
						|
    except Exception as e:
 | 
						|
        # Другие непредвиденные ошибки
 | 
						|
        return False, f"Произошла ошибка: {e}"
 | 
						|
 | 
						|
# Пример использования (для тестирования)
 | 
						|
async def main():
 | 
						|
    # Замените на реальные данные для теста
 | 
						|
    success, message = await login("testuser", "testpassword") 
 | 
						|
    print(f"Результат входа: {success}, Сообщение: {message}")
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    asyncio.run(main())
 |