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

时间:2018-12-09 17:14:34

标签: django-rest-framework token django-rest-auth

我的Django rest框架项目中有2个应用程序,分别是“帐户”和“ trello”。我已经使用了DRF的令牌身份验证。我已经为尝试登录“帐户”应用程序视图的用户进行了身份验证(验证)并生成了令牌。对于我的“ trello”应用程序的一种视图,我已经设置了authentication_classes = (TokenAuthentication,)permission_classes = [IsAuthenticated, ]。我还为DEFAULT_AUTHENTICATION_CLASSES做了必要的设置。

我的问题是:如何将标头和从我的“帐户”应用程序视图生成的令牌密钥发送到需要验证用户身份的视图(即“ trello”中的视图)?

我已经尝试过这种方式:

accounts / views.py:

import requests

myurl = "http://localhost:8000/trello/create/board/"

class LoginView(APIView):

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)

trello / views.py:

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

1 个答案:

答案 0 :(得分:2)

您可能缺少令牌认证流程。这是发生了什么:

  1. 客户端使用登录名和密码请求令牌
  2. 您的login视图(或我更喜欢称之为obtain-token视图)验证客户端提供的用户凭据并颁发令牌。请注意,您无需在此处执行任何Django登录,只需执行颁发令牌
  3. 在subsequest请求中,客户端将令牌添加到Auth标头中,DRF的TokenAuthentication类对请求进行身份验证(这是登录发生的位置),并将用户对象添加到请求中
  4. Voila!现在,您所有的请求都已通过身份验证,您可以向视图(例如trello视图)添加必要的权限