如何在此示例中包含对Django REST API的用户特定访问?

时间:2015-10-16 17:37:41

标签: django api django-rest-framework

我对通过API进行身份验证的理解是,客户端发送的HTTP请求需要包含凭据,无论是原始用户名和密码(可能是不良做法)还是哈希密码,令牌等。

通常在我的Django视图中,我只使用:

request.user.is_authenticated():

如果我希望我的API与iOS应用程序一起使用,那么这行代码无法使用,因为它依赖于会话/ cookie?

我想编辑以下函数,以允许它访问特定用户:

api_view(['GET'])
@csrf_exempt
def UserInfoAPI(request):
    ###if HTTP header includes name and password:###
        private_info = Entry.objects.filter(user=request.user)
        serializer = EntrySerializer(private_info, many=True)
    return Response(serializer.data)

是否有一种简单的方法可以在HTTP标头中手动检查用户名/密码?我实际上并不打算在生产环境中使用它,但为了便于理解,我想了解如何让这个函数验证来自http标头的用户名/传递。

1 个答案:

答案 0 :(得分:2)

Django REST Framework尝试确定发送请求的用户查看Authorization HTTP标头。您应该在此标头内发送的内容取决于您选择的身份验证方案。例如,如果您选择BasicAuthentication,则标题为:

Authorization: Basic <"user:password" encoded in base64>

或者,如果您选择TokenAuthentication

Authorization: Token <your token>

我会推荐TokenAuthentication计划。 docs中列出了更多方案。

要确保只有经过身份验证的用户才能访问该API的终端,请使用IsAuthenticated权限。这将在请求中检查用户的凭据,如果这些凭据不正确,则会引发HTTP 401 Unauthorized错误。

您的Django REST Framework视图如下所示:

from rest_framework import generics
from rest_framework.permissions import IsAuthenticated

class UserInfo(generics.ListAPIView):
    model = Entry
    serializer_class = EntrySerializer
    permission_classes = (IsAuthenticated,)

    def get_queryset(self):
        queryset = super(UserInfo, self).get_queryset()
        user = self.request.user
        return queryset.filter(user=user)

至于iOS应用中的代码,this post可能会有所帮助。