Flutter调用Django Rest Framework接口Token认证失败问题求助
问题描述
前端使用Flutter、后端使用Django,登录接口可正常返回Token,但调用/api/dj-rest-auth/user/接口获取用户详情时,始终收到{detail: Authentication credentials were not provided.}的未授权错误,Django终端显示Forbidden: /api/dj-rest-auth/user/。
Flutter请求代码
final response = await http.get( url, headers: { HttpHeaders.authorizationHeader: 'Authorization: Bearer ......bla bla ..........', //'Bearer ......bla bla bla ...', }, );
Django配置(settings.py)
INSTALLED_APPS = [ ....................... 'rest_framework', 'users', 'corsheaders', 'django.contrib.sites', 'rest_framework.authtoken', 'dj_rest_auth', 'allauth', 'allauth.account', 'allauth.socialaccount', 'dj_rest_auth.registration', ] # REST_FRAMEWORK = { # 'DEFAULT_PERMISSION_CLASSES': [ # 'rest_framework.permissions.AllowAny', # # ]} REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', ), 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ) } CORS_ALLOW_ALL_ORIGINS=True AllowAny =True
尝试使用rest_framework.permissions.AllowAny时返回禁止错误,使用DEFAULT_AUTHENTICATION_CLASSES配置时返回未授权错误。
自定义视图代码
@csrf_exempt def aPage(request): user:User=User.objects.get(pk=1) username=request.POST.get("username") email=request.POST.get("email") print(email) print(username) return JsonResponse({"Username":username , "email": email})
请问如何通过Token对已登录用户进行认证,使其能够从API获取数据?哪里操作错误导致了这些问题?
问题排查与解决方案
1. Flutter请求头格式错误
这是核心问题:HttpHeaders.authorizationHeader对应的键就是Authorization,值里不需要重复写Authorization: 前缀,正确写法直接传Bearer <你的Token>即可。
修改后的Flutter代码:
final response = await http.get( url, headers: { HttpHeaders.authorizationHeader: 'Bearer ......bla bla ..........', }, );
2. Django配置冗余项清理
- 删除无效的
AllowAny =True,这个变量对Django/DRF无任何作用,属于冗余配置。 - 当前的
REST_FRAMEWORK配置是正确的(启用Token认证+要求登录访问),无需改回AllowAny。之前用AllowAny仍报错,是因为请求头Token格式错误,导致/user/接口(本身逻辑为仅返回当前登录用户信息)对匿名访问返回Forbidden。
3. 自定义视图的认证适配(若需Token访问)
你的自定义视图aPage是普通Django函数视图,不会自动处理DRF的Token认证。若要让该视图支持Token认证,需改用DRF的APIView重构:
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated from django.contrib.auth.models import User class APageView(APIView): permission_classes = [IsAuthenticated] # 要求登录访问 def post(self, request): username = request.data.get("username") email = request.data.get("email") print(email) print(username) return Response({"Username": username, "email": email})
之后在urls.py中配置该视图的路由,即可通过Token正常访问。
验证步骤
- 修正Flutter请求头后,重新调用
/api/dj-rest-auth/user/,应能正常返回当前用户信息。 - 若测试自定义视图,使用重构后的DRF视图+正确的Token请求头,即可正常返回数据。
内容的提问来源于stack exchange,提问作者A_K
相关产品推荐
相关产品推荐

