You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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正常访问。

验证步骤

  1. 修正Flutter请求头后,重新调用/api/dj-rest-auth/user/,应能正常返回当前用户信息。
  2. 若测试自定义视图,使用重构后的DRF视图+正确的Token请求头,即可正常返回数据。

内容的提问来源于stack exchange,提问作者A_K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:01:02