从 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