diff --git a/backend/igny8_core/api/authentication.py b/backend/igny8_core/api/authentication.py index 723abeef..e3930a88 100644 --- a/backend/igny8_core/api/authentication.py +++ b/backend/igny8_core/api/authentication.py @@ -62,20 +62,16 @@ class JWTAuthentication(BaseAuthentication): # User not found - return None to allow other auth classes to try return None - # Get account from token (token's account_id is authoritative for current context) + # Get account from token account_id = payload.get('account_id') account = None if account_id: try: account = Account.objects.get(id=account_id) - # Verify user has access to this account - # For developers/admins, they can access any account - # For regular users, verify they belong to this account - if not user.is_admin_or_developer() and not user.is_system_account_user(): - # Regular user - must belong to this account - if user.account and user.account.id != account_id: - # User doesn't belong to token's account - use user's account instead - account = user.account + # If user's account changed, use the new one from user object (most up-to-date) + # This ensures we always use the user's current account, not a stale token account_id + if user.account and user.account.id != account_id: + account = user.account except Account.DoesNotExist: # Account from token doesn't exist - use user's account instead pass diff --git a/backend/igny8_core/auth/middleware.py b/backend/igny8_core/auth/middleware.py index 5b82fb26..1bcdd16f 100644 --- a/backend/igny8_core/auth/middleware.py +++ b/backend/igny8_core/auth/middleware.py @@ -99,20 +99,12 @@ class AccountContextMiddleware(MiddlewareMixin): user = User.objects.select_related('account', 'account__plan').get(id=user_id) request.user = user if account_id: - # Verify account still exists + # Verify account still exists and matches user account = Account.objects.get(id=account_id) - # Token's account_id is authoritative for current context - # For developers/admins, they can access any account - # For regular users, verify they belong to this account - if not user.is_admin_or_developer() and not user.is_system_account_user(): - # Regular user - must belong to this account - if user.account and user.account.id != account_id: - # User doesn't belong to token's account - use user's account instead - request.account = user.account - else: - request.account = account + # If user's account changed, use the new one from user object + if user.account and user.account.id != account_id: + request.account = user.account else: - # Developer/admin/system user - use token's account (they can access any) request.account = account else: try: