Как решить проблему "detail": "Учетные данные для аутентификации не были предоставлены". Django REST Framework?
Я столкнулся с проблемой в Django REST Framework, где я получаю ошибку "Unauthorized" при попытке доступа к защищенной конечной точке /api/user/
, несмотря на то, что я реализовал аутентификацию на основе токенов. Вот обзор моих настроек:
- У меня есть бэкенд Django, обслуживающий REST API с помощью Django REST Framework.
- Аутентификация на основе токенов реализована с помощью встроенного в Django класса TokenAuthentication.
- Фронтенд разработан с использованием React и Axios для выполнения API-запросов.
Несмотря на успешный вход в систему и получение токена, последующие запросы к защищенным конечным точкам завершаются с ошибкой "Unauthorized". Я дважды проверил следующее:
- Токен корректно хранится в localStorage и отправляется с каждым запросом.
- URLs во фронтенде (запросы Axios) являются относительными к базовому URL API (
http://127.0.0.1:8000/api/
). - Сервер Django работает по ожидаемому адресу и порту (
http://127.0.0.1:8000/
).
Однако я по-прежнему сталкиваюсь с ошибкой "Unauthorized".
Вот соответствующие части моего кода:
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');
}
}
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;
views.py
:
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'),
]
settings.py
:
Я ищу рекомендации по устранению неполадок и решению этой проблемы. Любые предложения или соображения будут очень признательны. Спасибо!