【问题标题】:getting error Authentication credentials were not provided in django rest frameworkdjango rest 框架中未提供错误身份验证凭据
【发布时间】:2022-06-25 20:25:00
【问题描述】:

大家好,我在 DRF 中创建登录 api 并得到响应,但我测试到其他 api 的令牌然后得到错误 没有提供身份验证凭据, 我不知道我在哪里出错了,请帮帮我。自定义用户模型也无法使用,因为我已经使用过该模型

setting.py-这是设置文件

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'api.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework_simplejwt.authentication.JWTAuthentication'
    ),
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
        'rest_framework_datatables.renderers.DatatablesRenderer',
    ),
    'DEFAULT_FILTER_BACKENDS': (
        'rest_framework_datatables.filters.DatatablesFilterBackend',
    ),
    'DEFAULT_PAGINATION_CLASS': 'rest_framework_datatables.pagination.DatatablesPageNumberPagination',
    'PAGE_SIZE': 100,
}

models.py

class GmsUser(GmsBaseModel):
    first_name=models.CharField(max_length=255,null=True, blank=True)
    middle_name=models.CharField(max_length=255,null=True, blank=True)
    last_name=models.CharField(max_length=255,null=True, blank=True)
    user_name=models.CharField(max_length=255,null=True, blank=True, unique=True)
    password=models.CharField(max_length=255,null=True, blank=True)
    token = models.CharField(max_length=255, null=True)

    class Meta:
        db_table = "gms_users"
    def __str__(self):
        return self.user_name

views.py

@csrf_exempt
@api_view(["POST"])
@permission_classes((AllowAny,))
def gms_user_login(request):
    user_name = request.data.get("user_name")
    password = request.data.get("password")
    users=GmsUser.objects.filter(user_name=user_name).values_list('id',flat=True)
    role=GmsRole.objects.filter(id=GmsUserRole.objects.filter(user=users[0]).values_list('role',flat=True)[0]).values_list('role',flat=True)[0]
    # city=GmsUserProfile.objects.filter(user=users[0]).values_list('city',flat=True)[0]
    try:
        query=GmsUserRole.objects.filter(user=users[0]).exists()
    except Exception as e:
        return Response({"message":"User not found","error":True,"code":400,"results":str(e)},status=HTTP_400_BAD_REQUEST)
    if user_name is None or password is None:
        return Response({'detail': 'Please provide both username and password'})
    else:
        try:
            if query:
                user = GmsUser.objects.get(user_name=user_name)
        except GmsUser.DoesNotExist:
            return Response({'detail': 'Invalid UserName'})
        if user.password.lower() != password.lower():
            return Response({'detail': 'Invalid Password'})
    user.token=get_random_string(length=50)
    user.save()
    response_data=GmsUserSignupSerializer(user).data
    response_data1=GmsRoleSerializer(GmsRole.objects.get(role=role)).data
    response_data2=GmsUserProfileSerializer(GmsUserProfile.objects.get(user=users[0])).data
    response_data['roles']=response_data1
    response_data['user_profile']=response_data2
    try:
        return JsonResponse({"message": "login","error":False,"code":200,"results":{'token':user.token,'user':response_data}},status=HTTP_200_OK)
    except Exception as e:
        return JsonResponse({"message": "login","error":True,"code":500,"results":str(e)},status=HTTP_200_OK)

登录 api 响应

{
    "message": "login",
    "error": false,
    "code": 200,
    "results": {
        "token": "7R1EAR6qQdTyM6ZvD7kHfwdCHoj33tsp1QXUCIXSqU8929uMOq",
        "user": {
            "id": 4,
            "user_name": "edwin",
            "password": "1234"
            "roles": {
                "id": 1
            },
            "user_profile": {
                "id": 2
                "city": 1
            }
        }
    }
}

【问题讨论】:

  • 我认为 api.authentication.TokenAuthentication 是错误的。请出示代码。
  • 您必须使用api.authentication.TokenAuthentication。但我建议使用 rest 框架包提供的内置系统。也许我可以添加使用rest_framework.authtoken 的代码。你想让我这样做吗?
  • @MukhtorRasulov 我已经分享了代码?你想要哪个代码?
  • 您是如何在其他 API 上使用令牌的?你能用它更新你的问题吗?

标签: python django django-rest-framework django-authentication


【解决方案1】:

我认为您需要在 settings.py 中设置正确的 authentication 类。 现在定义了4个类。但我认为你必须设置一个类。

如果您选择rest_framework.authentication.TokenAuthentication,则无需使用随机字符串创建令牌。 rest_framework.authtoken 应用程序将创建 Token 模型,您可以使用它。

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        # 'api.authentication.TokenAuthentication',
        # 'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
        # 'rest_framework_simplejwt.authentication.JWTAuthentication'
    ),
    ...
}

【讨论】:

  • 它可以多次使用 Token 模型,因为我已经使用了另一个登录 api,我已经更改了 setting.py 文件,但它对我有用
  • 不,它不适合我。
  • 我还能如何帮助您?
  • 我可以尝试以不同的方式解决这个问题,但这里出错了,我已经发布了问题。 stackoverflow.com/questions/72367290/…
  • 在使用用户名和密码在邮递员处点击登录 api 时获取 [WSGIRequest' 对象没有属性 'data]
猜你喜欢
  • 1970-01-01
  • 2020-08-21
  • 2017-11-22
  • 2015-05-16
  • 2019-04-29
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
相关资源
最近更新 更多