我对通过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标头的用户名/传递。
答案 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可能会有所帮助。