Django rest framework 如何在DRF中的令牌身份验证中从视图传递头

Django rest framework 如何在DRF中的令牌身份验证中从视图传递头,django-rest-framework,token,django-rest-auth,Django Rest Framework,Token,Django Rest Auth,我的django rest框架项目中有两个应用程序,即“accounts”和“trello”。我使用了DRF的令牌身份验证。我已经为尝试登录我的“帐户”应用程序视图的用户进行了身份验证(验证)并生成了令牌。对于我的“trello”应用程序的一个视图,我已经设置了authentication\u classes=(TokenAuthentication),和permission\u classes=[IsAuthenticated,]。我还为默认\u authentication\u classe

我的django rest框架项目中有两个应用程序,即“accounts”和“trello”。我使用了DRF的令牌身份验证。我已经为尝试登录我的“帐户”应用程序视图的用户进行了身份验证(验证)并生成了令牌。对于我的“trello”应用程序的一个视图,我已经设置了
authentication\u classes=(TokenAuthentication),
permission\u classes=[IsAuthenticated,]
。我还为
默认\u authentication\u classes
做了必要的设置

我的问题是:如何将带有从“帐户”应用程序视图生成的令牌密钥的标题发送到需要对用户进行身份验证的视图,即“trello”中的视图

我试过这样做:

accounts/views.py:

导入请求

myurl=”http://localhost:8000/trello/create/board/“

类登录视图(APIView):

trello/views.py:


我实际上不知道如何在这里捕获数据。我试图使用django请求从帐户的视图发布数据。我尝试在这里使用get方法,但它没有按我希望的那样工作。我可能尝试了错误的方法,但有人能纠正吗?

您可能缺少令牌身份验证流。发生的情况如下:

  • 客户端使用登录名和密码请求令牌
  • 您的
    登录
    视图(或我更喜欢称之为
    获取令牌
    视图)验证客户端提供的用户凭据并发出令牌。注意,您不需要在这里执行任何Django登录,您所需要做的就是发出令牌
  • 在subsequest请求中,客户机将令牌添加到Auth头,DRF的
    令牌身份验证
    类对请求进行身份验证(这是登录发生的地方),并将用户对象添加到请求中
  • 瞧!您的所有请求现在都已通过身份验证,您可以向视图添加必要的权限(例如trello视图)

  • 您可能缺少令牌身份验证流。发生的情况如下:

  • 客户端使用登录名和密码请求令牌
  • 您的
    登录
    视图(或我更喜欢称之为
    获取令牌
    视图)验证客户端提供的用户凭据并发出令牌。注意,您不需要在这里执行任何Django登录,您所需要做的就是发出令牌
  • 在subsequest请求中,客户机将令牌添加到Auth头,DRF的
    令牌身份验证
    类对请求进行身份验证(这是登录发生的地方),并将用户对象添加到请求中
  • 瞧!您的所有请求现在都已通过身份验证,您可以向视图添加必要的权限(例如trello视图)

  • 为什么需要将标题发送到另一个视图?如果正确指定了默认身份验证,则会对每个请求进行全局身份验证classes@Ken4scholars不,它(具有IsAuthenticated permission\u类的视图)不允许用户访问该视图。这很明显,因为用户必须通过标头提供令牌,所以我想代表用户在标头中添加该令牌。一旦用户在报头中提供了令牌,那么DRF将在其级别上查看用户是否是经过身份验证的用户,是否基于令牌等等……我的意思是,这就是我目前所理解的!您不需要自己将令牌添加到头中,客户端应用程序需要这样做。检查下面的答案为什么需要将标题发送到其他视图?如果正确指定了默认身份验证,则会对每个请求进行全局身份验证classes@Ken4scholars不,它(具有IsAuthenticated permission\u类的视图)不允许用户访问该视图。这很明显,因为用户必须通过标头提供令牌,所以我想代表用户在标头中添加该令牌。一旦用户在报头中提供了令牌,那么DRF将在其级别上查看用户是否是经过身份验证的用户,是否基于令牌等等……我的意思是,这就是我目前所理解的!您不需要自己将令牌添加到头中,客户端应用程序需要这样做。检查我下面的答案,让我们在这里弄清楚,你能探索你的第三点吗?您是说用户每次都必须手动在标头中添加令牌吗?如果是这样,这对这个应用程序来说是不舒服的,因为用户将不得不多次访问该视图,我还将提供注销视图,在该视图中我将删除令牌,以迫使用户再次登录。我不希望用户每次都手动添加令牌。另外,您能告诉我在哪里使用
    令牌身份验证吗?我已经完成了您的第二点。@user10058776不要混淆用户和客户端应用程序。在第一次请求获取令牌后,所有后续请求只需将令牌添加到头中,直到令牌过期或用户注销,然后您必须再次获取令牌。相信我,与OAuth2等更复杂的API验证流相比,这是一个简单的API验证流。除了将
    TokenAuthentication
    类添加到
    DEFAULT\u AUTHENTICATION\u CLASSES
    设置或按视图添加之外,您不必对
    TokenAuthentication
    类执行任何操作。同样,获取令牌请求只发出一次,直到令牌发出expires@user10058776为了清楚起见,用户对令牌一无所知。前端应用程序(web或移动应用程序)不支持。他们只是简单地用用户的密码交换一个令牌,并使用该令牌发出请求,而不是每次都使用登录名和密码(这不是很安全)。这就是令牌身份验证的要点,以及客户端如何将令牌添加到头中?如果您知道如何使用客户端发出请求,那么这非常简单。只需像添加其他HTTP头一样添加它。现在,如果您不知道如何在正在使用的框架中添加HTTP头,请使用t
    permission_classes = [AllowAny]
    serializer_class = UserLoginSerializer
    
    def post(self, request, *args, **kwargs):
        data = request.data
        serializer = UserLoginSerializer(data=data, context={'request': request})
        serializer.is_valid(raise_exception=True)
        print(serializer.validated_data['user'])
        user = serializer.validated_data['user']
        print("user", user)
        token, created = Token.objects.get_or_create(user=user)
        requests.post(myurl, data=serializer.validated_data, headers={'Authorization': 'Token {}'.format(token)})
        # django_login(request, user)
        return Response({'token': token.key},
                        status=HTTP_200_OK)