【问题标题】:how to pass header from views in token authentication in DRF如何在 DRF 中的令牌身份验证中从视图中传递标头
【发布时间】:2019-05-10 16:57:24
【问题描述】:

我的 django rest 框架项目中有 2 个应用程序,即“accounts”和“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 方法,但它没有按我想要的那样工作。我可能尝试了错误的方法,但是有人可以纠正吗?

【问题讨论】:

  • 为什么需要将标题发送到另一个视图?如果您正确指定了默认身份验证类,则身份验证会针对每个请求在全局范围内进行
  • @Ken4scholars 不,它不是(具有 IsAuthenticated 权限类的视图)允许用户查看该视图。这很明显,因为用户必须通过标头提供令牌,所以我想代表用户在标头中添加该令牌。一旦用户在标头中提供了令牌,那么其级别的 DRF 将根据令牌左右查看用户是否是经过身份验证的用户......我的意思是到目前为止我所理解的!
  • 您不需要自己将令牌添加到标头中,客户端应用程序需要。在下面查看我的答案

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


【解决方案1】:

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

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

【讨论】:

  • 先生,让我们在这里说清楚,您能探索一下您的第三点吗?您是说用户每次都必须在标头中手动添加令牌吗?如果是这样,这对这个应用程序来说不舒服,因为用户将不得不多次访问该视图,我还将提供注销视图,我将在其中删除令牌以强制用户再次登录。我不'不希望用户每次都手动添加令牌。另外,你能告诉我我要在哪里使用TokenAuthentication吗?我已经完成了你的第二点。
  • @user10058776 不要混淆用户和客户端应用程序。在第一次请求获取令牌后,所有后续请求只需将令牌添加到标头中,直到它过期或用户注销,然后您必须再次获取令牌。相信我,与 OAuth2 等更复杂的身份验证流程相比,这是一个简单的 API 身份验证流程。除了将TokenAuthentication 类添加到DEFAULT_AUTHENTICATION_CLASSES 设置或按视图添加它之外,您无需对TokenAuthentication 类执行任何操作。同样,获取令牌请求只进行一次,直到令牌过期
  • @user10058776 为了清楚起见,用户对令牌一无所知。前端应用程序(网络或移动应用程序)可以。他们只是简单地将用户密码交换为令牌并使用令牌发出请求,而不是每次都使用登录名和密码(这不是很安全)。这就是 Token 认证的重点
  • 以及客户端如何将令牌添加到标头中?
  • 好吧,如果您知道如何使用客户端发出请求,那将非常简单。只需像添加任何其他 HTTP 标头一样添加它。现在,如果您不知道如何在用于构建客户端的框架中添加 HTTP 标头,那么我建议您在继续之前了解更多有关它的信息。它需要在Authorization 标头中,格式为Authorization: Token <token>
猜你喜欢
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 2018-03-26
  • 1970-01-01
  • 2023-03-09
  • 2016-01-30
  • 2021-06-24
相关资源
最近更新 更多