from django.contrib.auth import authenticate from ninja import NinjaAPI, Schema from ninja.security import HttpBasicAuth, HttpBearer from typing import List, Optional from .models import * import secrets api = NinjaAPI() # Autenticació bàsica class BasicAuth(HttpBasicAuth): def authenticate(self, request, username, password): user = authenticate(username=username, password=password) if user: # Genera un token simple token = secrets.token_hex(16) user.auth_token = token user.save() return token return None # Autenticació per Token Bearer class AuthBearer(HttpBearer): def authenticate(self, request, token): try: user = Usuari.objects.get(auth_token=token) return user except Usuari.DoesNotExist: return None # Endpoint per obtenir un token, accés amb BasicAuth # amb o sense "trailing slash" @api.get("/token", auth=BasicAuth()) @api.get("/token/", auth=BasicAuth()) def obtenir_token(request): return {"token": request.auth} # Exemple d'endpoint per llistar els llibres, accés amb TokenAuth class LlibreOut(Schema): id: int titol: str editorial: Optional[str] @api.get("/llibres/", response=List[LlibreOut], auth=AuthBearer()) def get_llibres(request): qs = Llibre.objects.all() return qs