add socket verifity token
This commit is contained in:
		
							parent
							
								
									bfc63823bd
								
							
						
					
					
						commit
						9b5ffcccce
					
				@ -60,6 +60,72 @@ async def _fetch_current_user(
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class AuthInvalidToken(Exception): pass
 | 
			
		||||
class AuthSessionNotFound(Exception): pass
 | 
			
		||||
class AuthPermissionDenied(Exception): pass
 | 
			
		||||
class AuthConflictError(Exception): pass
 | 
			
		||||
class AuthServiceError(Exception): pass
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def fetch_user_for_sio(
 | 
			
		||||
    token: str,
 | 
			
		||||
    ip: str,
 | 
			
		||||
    user_agent: str,
 | 
			
		||||
    require_permissions: bool = False
 | 
			
		||||
) -> CurrentUser:
 | 
			
		||||
    """
 | 
			
		||||
    Fetches user data for Socket.IO, decoupled from FastAPI's Request object.
 | 
			
		||||
    """
 | 
			
		||||
    try:
 | 
			
		||||
        response = await client.post(
 | 
			
		||||
            f"{settings.TOKEN_SERVICE}/decode",
 | 
			
		||||
            json={
 | 
			
		||||
                "token": token,
 | 
			
		||||
                "ip": ip,
 | 
			
		||||
                "user_agent": user_agent,
 | 
			
		||||
                "require_permissions": require_permissions
 | 
			
		||||
            },
 | 
			
		||||
        )
 | 
			
		||||
    except httpx.RequestError as e:
 | 
			
		||||
        # Сервис недоступен (network error / timeout)
 | 
			
		||||
        raise AuthServiceError("Token service unavailable") from e
 | 
			
		||||
 | 
			
		||||
    # Если не 200, разбираем ошибку
 | 
			
		||||
    if response.status_code != 200:
 | 
			
		||||
        try:
 | 
			
		||||
            error_json = response.json()
 | 
			
		||||
            message = error_json.get("errors", [{}])[0].get("message", "Unknown error")
 | 
			
		||||
        except ValueError:
 | 
			
		||||
            message = response.text or "Unknown error"
 | 
			
		||||
        
 | 
			
		||||
        print("response.status_code", response.status_code)
 | 
			
		||||
        # Разные статусы → разные исключения
 | 
			
		||||
        if response.status_code in (400, 401):
 | 
			
		||||
            raise AuthInvalidToken(message)
 | 
			
		||||
        elif response.status_code == 403:
 | 
			
		||||
            raise AuthPermissionDenied(message)
 | 
			
		||||
        elif response.status_code == 404:
 | 
			
		||||
            raise AuthSessionNotFound(message)
 | 
			
		||||
        elif response.status_code == 409:
 | 
			
		||||
            raise AuthConflictError(message)
 | 
			
		||||
        elif response.status_code >= 500:
 | 
			
		||||
            raise AuthServiceError("Authentication service error: " + message)
 | 
			
		||||
        else:
 | 
			
		||||
            # fallback (нестандартный статус)
 | 
			
		||||
            raise AuthServiceError(message)
 | 
			
		||||
 | 
			
		||||
    # Успех
 | 
			
		||||
    wrapped = response.json()
 | 
			
		||||
    data = wrapped["data"]
 | 
			
		||||
 | 
			
		||||
    return CurrentUser(
 | 
			
		||||
        token=token,
 | 
			
		||||
        user_id=data["user_id"],
 | 
			
		||||
        session_id=data["session_id"],
 | 
			
		||||
        permissions=data["permissions"]
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def get_current_user(
 | 
			
		||||
    request: Request,
 | 
			
		||||
    credentials: HTTPAuthorizationCredentials = Depends(auth_scheme)
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
[project]
 | 
			
		||||
name = "common-lib"
 | 
			
		||||
version = "0.0.24"
 | 
			
		||||
version = "0.0.25"
 | 
			
		||||
description = "Библиотека общих компонентов для микросервисов yobble"
 | 
			
		||||
authors = [{ name = "cheykrym", email = "you@example.com" }]
 | 
			
		||||
license = "MIT"
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user