我对通过API进行身份验证的理解是,客户端发送的HTTP请求需要包括凭据,无论是原始用户名和密码(可能是不好的做法),还是散列的密码、令牌等。
通常在我的Django视图中,我只使用:
request.user.is_authenticated():
如果我希望我的应用程序接口与iOS应用程序一起使用,这行代码不能使用,因为它依赖于会话/cookies?
我想编辑以下函数,以允许其访问特定用户:
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报头中的用户名/pass?我实际上并不打算在生产环境中使用它,但为了理解,我想了解一下如何使用此函数验证http头中的用户名/pass。
发布于 2015-10-16 19:34:59
Django REST Framework试图通过查看Authorization
HTTP头来确定发送请求的用户。您应该在此标头中发送的内容取决于您选择的身份验证方案。例如,如果选择BasicAuthentication
,则标头将为:
Authorization: Basic <"user:password" encoded in base64>
或者,如果选择TokenAuthentication
Authorization: Token <your token>
我会推荐TokenAuthentication
方案。docs中列出了更多方案。
要确保只有经过身份验证的用户才能访问该接口的端点,请使用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可能会有所帮助。
https://stackoverflow.com/questions/33176379
复制相似问题