Как исправить {detail: Учетные данные для аутентификации не были предоставлены.} в Django Rest Framework
Я пытаюсь получить информацию из Django rest framework в качестве бэкенда и из фронтенда с помощью flutter.
Последовательность проекта такова, что я вхожу в систему и получаю {"key":"XXXXXXXXXXXXX"}
Просто в целях тестирования я пытаюсь вручную добавить ключ, чтобы получить доступ. Я продолжаю получать {detail: Authentication credentials were not provided.}
Я не уверен, является ли ошибка следствием настроек Django Rest Framework или фронт-энда Flutter
Вот Fetch user() на домашнем экране:
Future<User> fetchUser() async {
var url = Uri.parse(Config.apiURL + Config.userProfileAPI);
print(url);
final response = await http.post(
url,
// headers: {
// HttpHeaders.authorizationHeader:
// 'Bearer XXXXXXXXXXXXX',
headers: {
"Authorization": 'JWT XXXXXXXXXXXXX'
// 'Authorization: ',
},);
final responseJson = jsonDecode(response.body);
print(responseJson);
if (response.statusCode == 200) {
return User.fromJson(jsonDecode(response.body));
} else {
throw Exception('Failed to load User');
}}
class User {
int? pk;
String? username;
User({this.pk, this.username});
User.fromJson(Map<String, dynamic> json) {
pk = json['pk'];
username = json['username'];}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['pk'] = this.pk;
data['username'] = this.username;
return data;}}
class HomeScreen extends StatefulWidget {
const HomeScreen({super.key});
@override
State<HomeScreen> createState() => _HomeScreenState();}
class _HomeScreenState extends State<HomeScreen> {
late Future<User> futureUser;
@override
void initState() {
super.initState();
futureUser = fetchUser();}
@override
Widget build(BuildContext context) {
return MaterialApp(
.........................
FutureBuilder<User>(
future: futureUser,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text(snapshot.data!.username ?? 'noname');
} else if (snapshot.hasError) ;
print(snapshot.error);
{return Text('${snapshot.error}');}
return const CircularProgressIndicator();
},),),],)),),);}}
Вот настройки фреймворка Django Rest:
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework.authentication.BasicAuthentication', ),
# 'DEFAULT_AUTHENTICATION_CLASSES': (
# 'rest_framework.authentication.TokenAuthentication',
# ),
# # 'DEFAULT_PERMISSION_CLASSES': (
# # 'rest_framework.permissions.IsAuthenticated',
# # ),
# 'DEFAULT_PERMISSION_CLASSES': (
# 'rest_framework.permissions.AllowAny',
# ),
}
AUTHENTICATION_BACKENDS=['users.models.EmailBackend']
CORS_ALLOW_ALL_ORIGINS=True
AllowAny =True
Мой вопрос:
После входа в систему почему мой HttpHeaders.authorizationHeader
не работает, если пользователь уже вошел в систему, должен ли я иметь возможность напрямую получить данные пользователя, используя Token Key?
В моем Django я получаю Unauthorized: /api/dj-rest-auth/user/
Вам нужно добавить TokenAuthentication
к вашим DEFAULT_AUTHENTICATION_CLASSES
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
]
}
добавить rest_framework.authtoken
к INSTALLED_APPS
:
INSTALLED_APPS = [
...
'rest_framework.authtoken',
]
In Flutter:
headers: {
"Authorization": 'Token XXXXXXXXXXXXX'
},);