feat: make all authentication optional

This commit is contained in:
Daulet Amirkhanov 2025-08-20 18:32:30 +01:00
parent 624b4a6a61
commit 3e35c49ebd
5 changed files with 32 additions and 7 deletions

View file

@ -9,7 +9,7 @@ from fastapi import Form, File, UploadFile, Depends
from typing import List, Optional, Union, Literal
from cognee.modules.users.models import User
from cognee.modules.users.methods import get_authenticated_user
from cognee.modules.users.methods import get_optional_authenticated_user, get_default_user
from cognee.shared.utils import send_telemetry
from cognee.modules.pipelines.models import PipelineRunErrored
from cognee.shared.logging_utils import get_logger
@ -25,7 +25,7 @@ def get_add_router() -> APIRouter:
data: List[UploadFile] = File(default=None),
datasetName: Optional[str] = Form(default=None),
datasetId: Union[UUID, Literal[""], None] = Form(default=None, examples=[""]),
user: User = Depends(get_authenticated_user),
user: Optional[User] = Depends(get_optional_authenticated_user),
):
"""
Add data to a dataset for processing and knowledge graph construction.
@ -62,6 +62,10 @@ def get_add_router() -> APIRouter:
- The ALLOW_HTTP_REQUESTS environment variable controls URL processing
- datasetId value can only be the UUID of an already existing dataset
"""
# Use default user for anonymous requests
if user is None:
user = await get_default_user()
send_telemetry(
"Add API Endpoint Invoked",
user.id,

View file

@ -10,7 +10,7 @@ from starlette.status import WS_1000_NORMAL_CLOSURE, WS_1008_POLICY_VIOLATION
from cognee.api.DTO import InDTO
from cognee.modules.pipelines.methods import get_pipeline_run
from cognee.modules.users.models import User
from cognee.modules.users.methods import get_authenticated_user
from cognee.modules.users.methods import get_optional_authenticated_user, get_default_user
from cognee.modules.users.get_user_db import get_user_db_context
from cognee.modules.graph.methods import get_formatted_graph_data
from cognee.modules.users.get_user_manager import get_user_manager_context
@ -46,7 +46,7 @@ def get_cognify_router() -> APIRouter:
router = APIRouter()
@router.post("", response_model=dict)
async def cognify(payload: CognifyPayloadDTO, user: User = Depends(get_authenticated_user)):
async def cognify(payload: CognifyPayloadDTO, user: Optional[User] = Depends(get_optional_authenticated_user)):
"""
Transform datasets into structured knowledge graphs through cognitive processing.
@ -92,6 +92,10 @@ def get_cognify_router() -> APIRouter:
## Next Steps
After successful processing, use the search endpoints to query the generated knowledge graph for insights, relationships, and semantic search.
"""
# Use default user for anonymous requests
if user is None:
user = await get_default_user()
send_telemetry(
"Cognify API Endpoint Invoked",
user.id,

View file

@ -9,7 +9,7 @@ from cognee.api.DTO import InDTO, OutDTO
from cognee.modules.users.exceptions.exceptions import PermissionDeniedError
from cognee.modules.users.models import User
from cognee.modules.search.operations import get_history
from cognee.modules.users.methods import get_authenticated_user
from cognee.modules.users.methods import get_optional_authenticated_user, get_default_user
from cognee.shared.utils import send_telemetry
@ -33,7 +33,7 @@ def get_search_router() -> APIRouter:
created_at: datetime
@router.get("", response_model=list[SearchHistoryItem])
async def get_search_history(user: User = Depends(get_authenticated_user)):
async def get_search_history(user: Optional[User] = Depends(get_optional_authenticated_user)):
"""
Get search history for the authenticated user.
@ -50,6 +50,10 @@ def get_search_router() -> APIRouter:
## Error Codes
- **500 Internal Server Error**: Error retrieving search history
"""
# Use default user for anonymous requests
if user is None:
user = await get_default_user()
send_telemetry(
"Search API Endpoint Invoked",
user.id,
@ -66,7 +70,7 @@ def get_search_router() -> APIRouter:
return JSONResponse(status_code=500, content={"error": str(error)})
@router.post("", response_model=list)
async def search(payload: SearchPayloadDTO, user: User = Depends(get_authenticated_user)):
async def search(payload: SearchPayloadDTO, user: Optional[User] = Depends(get_optional_authenticated_user)):
"""
Search for nodes in the graph database.
@ -93,6 +97,10 @@ def get_search_router() -> APIRouter:
- To search datasets not owned by the request sender, dataset UUID is needed
- If permission is denied, returns empty list instead of error
"""
# Use default user for anonymous requests
if user is None:
user = await get_default_user()
send_telemetry(
"Search API Endpoint Invoked",
user.id,

View file

@ -5,3 +5,4 @@ from .get_default_user import get_default_user
from .get_user_by_email import get_user_by_email
from .create_default_user import create_default_user
from .get_authenticated_user import get_authenticated_user
from .get_optional_authenticated_user import get_optional_authenticated_user

View file

@ -0,0 +1,8 @@
from ..get_fastapi_users import get_fastapi_users
# Create optional authenticated user dependency using FastAPI Users' built-in optional parameter
fastapi_users = get_fastapi_users()
get_optional_authenticated_user = fastapi_users.current_user(
optional=True, # Returns None instead of raising HTTPException(401)
active=True # Still require users to be active when authenticated
)