Skip to content

Commit d66f9c8

Browse files
fix: standardize API token format across all creation paths
Three places were creating API tokens with inconsistent formats: - user.py: used uuid4().hex (no vtk_ prefix, no label, no signature) - views.py: stored raw frontend token (no format enforcement) - api_tokens/views.py: generated vtk_ but never persisted to DB All now use generate_api_key() for consistent vtk_ prefix, with label "Default", proper signature, and configurable expiry via API_KEY_EXPIRY_DAYS.
1 parent 6f17c7e commit d66f9c8

3 files changed

Lines changed: 35 additions & 5 deletions

File tree

backend/backend/core/routers/api_tokens/views.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,8 +182,25 @@ def regenerate_api_key(request: Request, key_id: str) -> Response:
182182
@api_view([HTTPMethods.POST])
183183
@handle_http_request
184184
def generate_token(request: Request) -> Response:
185-
"""Legacy token generation endpoint."""
185+
"""Legacy token generation endpoint.
186+
187+
Now creates a proper APIToken record with vtk_ prefix, label, and expiry
188+
to maintain consistency with the api-keys/create endpoint.
189+
"""
190+
# Delete any existing default token for this user
191+
APIToken.objects.filter(user=request.user, label="Default").delete()
192+
186193
api_key = generate_api_key()
194+
sig = generate_signature(api_key)
195+
196+
APIToken.objects.create(
197+
user=request.user,
198+
token=api_key,
199+
signature=sig,
200+
label="Default",
201+
expires_at=now() + timedelta(days=django_settings.API_KEY_EXPIRY_DAYS),
202+
)
203+
187204
return Response({
188205
"message": "Token generated successfully.",
189206
"token": api_key,

backend/backend/core/user.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import logging
2-
import uuid
32
from datetime import timedelta
43
from typing import Any, Optional
54

5+
from django.conf import settings as django_settings
66
from django.db import IntegrityError
77
from django.db import transaction
88
from django.utils.timezone import now
99

1010
from backend.core.models.api_tokens import APIToken
1111
from backend.core.models.organization_model import Organization
1212
from backend.core.models.user_model import User
13+
from backend.core.services.api_key_service import generate_api_key, generate_signature
1314

1415
Logger = logging.getLogger(__name__)
1516

@@ -87,11 +88,14 @@ def get_or_create_valid_token(self, user: User, organization: Organization):
8788
token.delete()
8889
token = None
8990
if token is None:
91+
api_key = generate_api_key()
9092
token = APIToken.objects.create(
9193
user=user,
9294
organization=organization,
93-
token=str(uuid.uuid4().hex),
94-
expires_at=now() + timedelta(days=90),
95+
token=api_key,
96+
signature=generate_signature(api_key),
97+
label="Default",
98+
expires_at=now() + timedelta(days=django_settings.API_KEY_EXPIRY_DAYS),
9599
)
96100
logging.info(f"A new api token for user: {user} and tenant: {organization} is created")
97101
except Exception as e:

backend/backend/core/views.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
from backend.utils.tenant_context import get_current_tenant
1717

1818
from backend.core.models.api_tokens import APIToken
19+
from backend.core.services.api_key_service import generate_api_key, generate_signature
20+
from django.conf import settings as django_settings
1921
from django.utils.timezone import now
2022
from datetime import timedelta
2123

@@ -61,7 +63,14 @@ def update_user_token(request, user):
6163
if existing_token:
6264
existing_token.delete()
6365

64-
APIToken.objects.create(user=user, token=new_token, expires_at= now() + timedelta(days=90))
66+
api_key = generate_api_key()
67+
APIToken.objects.create(
68+
user=user,
69+
token=api_key,
70+
signature=generate_signature(api_key),
71+
label="Default",
72+
expires_at=now() + timedelta(days=django_settings.API_KEY_EXPIRY_DAYS),
73+
)
6574
else:
6675
if existing_token:
6776
existing_token.delete()

0 commit comments

Comments
 (0)