fix: normal user logins calling admin endpoints

This commit is contained in:
cogwheel0
2025-09-09 13:15:49 +05:30
parent 74807babfe
commit 726e502d55
2 changed files with 31 additions and 27 deletions

View File

@@ -62,6 +62,11 @@ class ApiAuthInterceptor extends Interceptor {
}
}
// Endpoints that support optional auth should not strictly require it
if (_hasOptionalAuth(path)) {
return false;
}
// All other endpoints require authentication per OpenAPI spec
return true;
}
@@ -135,9 +140,19 @@ class ApiAuthInterceptor extends Interceptor {
// Handle authentication errors consistently
if (statusCode == 401) {
// 401 always indicates invalid/expired auth token
DebugLogger.auth('401 Unauthorized on $path - clearing auth token');
_clearAuthToken();
// Do not clear the token for public or optional-auth endpoints.
// A 401 here may indicate endpoint-level permission or server config,
// not necessarily an expired/invalid token.
final requiresAuth = _requiresAuth(path);
final optionalAuth = _hasOptionalAuth(path);
if (requiresAuth && !optionalAuth) {
DebugLogger.auth('401 Unauthorized on $path - clearing auth token');
_clearAuthToken();
} else {
DebugLogger.auth(
'401 on public/optional endpoint $path - keeping auth token',
);
}
} else if (statusCode == 403) {
// 403 on protected endpoints indicates insufficient permissions or invalid token
final requiresAuth = _requiresAuth(path);

View File

@@ -219,13 +219,19 @@ class ApiService {
DebugLogger.log('User settings retrieved successfully');
final settings = response.data as Map<String, dynamic>;
final data = response.data;
if (data is! Map<String, dynamic>) {
DebugLogger.warning(
'User settings response is empty or unexpected type: ${data.runtimeType}',
);
return null;
}
// Extract default model from ui.models array
final ui = settings['ui'] as Map<String, dynamic>?;
if (ui != null) {
final models = ui['models'] as List?;
if (models != null && models.isNotEmpty) {
final ui = data['ui'];
if (ui is Map<String, dynamic>) {
final models = ui['models'];
if (models is List && models.isNotEmpty) {
// Return the first model in the user's preferred models list
final defaultModel = models.first.toString();
DebugLogger.log(
@@ -239,25 +245,8 @@ class ApiService {
return null;
} catch (e) {
DebugLogger.error('Error fetching default model from user settings', e);
// Fall back to trying the old endpoint
try {
DebugLogger.log('Falling back to configs/models endpoint');
final response = await _dio.get('/api/v1/configs/models');
final config = response.data as Map<String, dynamic>;
final defaultModel =
config['DEFAULT_MODELS'] as String? ??
config['default_models'] as String? ??
config['default_model'] as String?;
if (defaultModel != null && defaultModel.isNotEmpty) {
DebugLogger.log('Found default model from fallback: $defaultModel');
return defaultModel;
}
} catch (fallbackError) {
DebugLogger.error('Fallback also failed', fallbackError);
}
// Do not call admin-only configs endpoint here; let the caller
// handle fallback (e.g., first available model from /api/models).
return null;
}
}