auth.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. from django.contrib.auth import authenticate
  2. from ninja import Form, Router, Schema
  3. from ninja.security import HttpBearer
  4. from api.models import Token
  5. router = Router()
  6. class GlobalAuth(HttpBearer):
  7. def authenticate(self, request, token):
  8. try:
  9. return Token.objects.get(token=token).user
  10. except Token.DoesNotExist:
  11. pass
  12. class AuthSchema(Schema):
  13. email: str
  14. password: str
  15. @router.post("/authenticate", auth=None) # overriding global auth
  16. def get_token(request, auth_data: AuthSchema):
  17. user = authenticate(username=auth_data.email, password=auth_data.password)
  18. if user:
  19. # Assuming a user can have multiple tokens and you want to create a new one every time
  20. new_token = Token.objects.create(user=user)
  21. return {"token": new_token.token, "expires": new_token.expiry_as_iso8601}
  22. else:
  23. return {"error": "Invalid credentials"}
  24. class TokenValidationSchema(Schema):
  25. token: str
  26. @router.post("/validate_token", auth=None) # No authentication required for this endpoint
  27. def validate_token(request, token_data: TokenValidationSchema):
  28. try:
  29. # Attempt to authenticate using the provided token
  30. user = GlobalAuth().authenticate(request, token_data.token)
  31. if user:
  32. return {"status": "valid"}
  33. else:
  34. return {"status": "invalid"}
  35. except Token.DoesNotExist:
  36. return {"status": "invalid"}