Как решить проблему "detail": "Учетные данные для аутентификации не были предоставлены". Django REST Framework?

Я столкнулся с проблемой в Django REST Framework, где я получаю ошибку "Unauthorized" при попытке доступа к защищенной конечной точке /api/user/, несмотря на то, что я реализовал аутентификацию на основе токенов. Вот обзор моих настроек:

  • У меня есть бэкенд Django, обслуживающий REST API с помощью Django REST Framework.
  • Аутентификация на основе токенов реализована с помощью встроенного в Django класса TokenAuthentication.
  • Фронтенд разработан с использованием React и Axios для выполнения API-запросов.

Несмотря на успешный вход в систему и получение токена, последующие запросы к защищенным конечным точкам завершаются с ошибкой "Unauthorized". Я дважды проверил следующее:

  1. Токен корректно хранится в localStorage и отправляется с каждым запросом.
  2. URLs во фронтенде (запросы Axios) являются относительными к базовому URL API (http://127.0.0.1:8000/api/).
  3. Сервер Django работает по ожидаемому адресу и порту (http://127.0.0.1:8000/).

Однако я по-прежнему сталкиваюсь с ошибкой "Unauthorized".

Вот соответствующие части моего кода:

  1. userApi.js:
import api from './axiosConfig';

function getAuthToken() {
    return localStorage.getItem('token');
}

export async function getUsers() {
    try {
        const response = await api.get('users/');
        return response.data;
    } catch (error) {
        console.error('Error fetching users:', error.response || error.message || error);
        throw new Error('Failed to fetch users');
    }
}

export async function updateUser(userId, updatedData) {
    const authToken = getAuthToken();
    const url = `users/${userId}/`; // Correction: Utilisation de l'URL relative
    try {
        const response = await api.patch(url, updatedData, {
            headers: {
                Authorization: `Token ${authToken}`
            }
        });
        return response.data;
    } catch (error) {
        throw new Error(`Failed to update user with ID ${userId}`);
    }
}

export async function getUserById(userId) {
    const authToken = getAuthToken();
    const url = `users/${userId}/`; // Correction: Utilisation de l'URL relative
    try {
        const response = await api.get(url, {
            headers: {
                Authorization: `Token ${authToken}`
            }
        });
        return response.data;
    } catch (error) {
        throw new Error(`Failed to fetch user with ID ${userId}`);
    }
}

// Fonction pour créer un nouveau compte utilisateur
export async function registerUser(userData) {
    try {
        const response = await api.post('register/', userData); // Correction: Utilisation de l'URL relative
        return response.data;
    } catch (error) {
        throw new Error('Failed to register user');
    }
}

// Fonction pour se connecter et obtenir un token
export async function loginUser(username, password) {
    try {
        const response = await api.post('login/', {
            username: username,
            password: password
        });
        const token = response.data.token;
        localStorage.setItem('token', token);
        // Envoi du token avec chaque requête dans axiosConfig.js, donc pas besoin de le faire ici explicitement
        return token;
    } catch (error) {
        console.error('Login error:', error);
        throw new Error('Invalid username or password');
    }
}

  1. axiosConfig.js:
import axios from 'axios';

const api = axios.create({
    baseURL: '/api/',
});

function getAuthToken() {
    return localStorage.getItem('token');
}

api.interceptors.request.use(
    (config) => {
        const token = getAuthToken();
        if (token) {
            config.headers['Authorization'] = `Token ${token}`;
        }
        return config;
    },
    (error) => Promise.reject(error)
);

export default api;

  1. views.py:
  1. urls.py:
urlpatterns = [
    path('login/', views.ignore_login),  # Ignorer la route /login/
    path('admin/', admin.site.urls),
    path('api/users/', views.get_users, name='api_get_users'),
    path('api/validate/<int:user_id>/', views.validate_user, name='validate_user'),
    path('api/user-details/<int:user_id>/', views.get_user_details, name='get_user_details'),
    path('api/register/', views.register_user, name='register_user'),
    path('api/login/', views.login_user, name='login_user'),
    path('api/token-auth/', obtain_auth_token, name='api_token_auth'),
    # Ajoutez une route pour obtenir les informations de l'utilisateur connecté
    path('api/user/', views.get_user, name='api_get_user'),
]

  1. settings.py:

Я ищу рекомендации по устранению неполадок и решению этой проблемы. Любые предложения или соображения будут очень признательны. Спасибо!

Вернуться на верх