从 Django Rest Framework 中的令牌获取经过身份验证的用户

Posted

技术标签:

【中文标题】从 Django Rest Framework 中的令牌获取经过身份验证的用户【英文标题】:Get Authenticated user from token in Django Rest Framework 【发布时间】:2014-06-07 18:28:02 【问题描述】:

我是 Django 的新手,我已经设法使用 DRF 构建了一个小型 API。我有我的 angular.js 客户端发布用户身份验证详细信息,DRF 返回一个如下所示的令牌:

 'token' : '9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b' 

基于tutorial,我应该从request.user 检索详细信息 但我不知道在哪里做这个。我觉得它令人困惑,因为它没有给出一个很好的例子。任何人都知道如何解决它?非常感谢您的意见。

下面是我的视图和序列化器的代码。

from serializers import ExampleSerializer
from models import Example
from rest_framework import viewsets

class ExampleViewSet(viewsets.ModelViewSet):
    """
    Example api description
    """
    queryset = Example.objects.all()
    serializer_class = ExampleSerializer    

序列化器

 from models import Example
 from rest_framework import serializers

 class ExampleSerializer(serializers.ModelSerializer):
      class Meta:
        model = Example
        fields = ('id', 'field_one', 'field_two', 'created_at', 'updated_at')
        depth = 1

【问题讨论】:

看看angular/drf seed - 它包括身份验证。 Drf-seed 不提供认证用户的用户名等详细信息,而只是提供获取更多资源的令牌。请看一下。我想用这个令牌返回用户详细信息。 【参考方案1】:

请记住,我也是 Angular 和 DRF 的新手...

如果您已经收到令牌,那么在 angularjs 方面,您需要将令牌包含在后续请求的标头中。可能就像验证请求中的这个缩写代码:

$http(auth request code here).then(function(response)
  var token = response.headers().token
  $http.defaults.headers.common['Authorization'] = 'Token ' + token;
);

在你的 ViewSet 中你可能想要

authentication_classes = (TokenAuthentication,)

以及任何相关的权限类。

如果您在 Angular http 请求中包含了 Token,那么我相信您可以使用 request.user 来引用用户,例如

def list(self, request):
    queryset = SomeObject.objects.filter(owner=request.user)

或者,这里还有一个用法(用户模型是django.contrib.auth.models.User):

class UserView(RetrieveAPIView):
    model = User
    serializer_class = UserSerializer

    def retrieve(self, request, pk=None):
        """
        If provided 'pk' is "me" then return the current user.
        """
        if request.user and pk == 'me':
            return Response(UserSerializer(request.user).data)
        return super(UserView, self).retrieve(request, pk)

【讨论】:

我试图环顾四周,我已经解决了这可能是最好的选择。这个对我有用。谢谢。 我用它来解决类似的问题,但建议覆盖 get_serializer_class 以选择正确的序列化程序,而不是直接从检索设置 pk 调用 Respond,如下所示:self.kwargs["pk"] = request.user.pk pk = request.user.pk 这样您就可以尽可能少地更改默认行为。 所以你是在告诉我,我必须在每个请求中发送“用户”?我认为它应该像这样工作:如果用户点击用户信息“GET”方法调用,在标头中使用令牌,他们应该提供基于当前令牌持有者的详细信息(BE 应该知道哪个用户拥有这个令牌)【参考方案2】:

就我而言,我正在尝试使用 API REST 客户端测试我的 API。当我将 Header 放入配置中时,它可以工作。

Authorization: Token <<token>>

【讨论】:

以上是关于从 Django Rest Framework 中的令牌获取经过身份验证的用户的主要内容,如果未能解决你的问题,请参考以下文章

从 Django django-rest-framework 视图有条件地返回 JSON 或 HTML 响应

Django Rest Framework ModelViewSet 视图没有从数据表中看到 CSRFToken

从 Django REST Framework 中的 APIView 中获取完整的请求 URL

django-rest-framework-simplejwt 禁用刷新

Django rest framework 之版本

Django REST framework视图