我已经使用了令牌身份验证,并且工作正常,即正在对用户进行身份验证,然后用户登录。但是在我的视图中,我为其中一个视图设置了权限类为IsAuthenticated,但是没有即使该用户是经过身份验证的用户,也允许该用户使用。 以下是显示我已登录(jadhav@gmail.com)的屏幕截图:
及其下一个选项卡显示“未提供身份验证详细信息”:
有人可以说出什么问题吗? 好的,我在提供详细信息: 这些是我的设置:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated', )
}
这是我的身份验证方式:
UserLoginAPIView(APIView)类:
permission_classes = [AllowAny]
serializer_class = UserLoginSerializer
def post(self, request, *args, **kwargs):
data = request.data
serializer = UserLoginSerializer(data=data)
if serializer.is_valid(raise_exception=True):
# new_data = serializer.data
if serializer.data:
user = authenticate(username=request.data['username'], password=request.data['password'])
login(request, user)
print("IsAuthenticated", user.is_authenticated)
token, _ = Token.objects.get_or_create(user=user)
return Response({'token': token.key},
status=HTTP_200_OK)
我在其中设置了限制的另一种观点:
BoardCreateAPIView(CreateAPIView)类:
queryset = Boards.objects.all()
serializer_class = BoardCreateSerializer
permission_classes = (IsAuthenticated,)
答案 0 :(得分:1)
在Django rest框架中,您应该在请求标头中提供令牌。这是带有curl命令的示例:
curl -X POST -H "Content-Type: application/json" -H "Authorization: Token <MY_TOKEN>" http://my-api-url
还要检查您的settings.py
中至少有以下几行:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
)
}
更多了解,请阅读此doc from django rest framework
答案 1 :(得分:0)
就像@Reza所暗示的那样,您缺少令牌身份验证的要点。您正在尝试使用基本身份验证流程。流程是这样的:
在后续请求中,客户端将令牌添加到Auth标头中,如下所示:
Authorization: Token <the_client_token>
因此,在登录视图中应该执行的操作是验证用户凭据并创建令牌。您不应该尝试自己执行身份验证。您可以将视图重命名为obtain_token
,以免混淆其功能。
检查文章@Reza链接以获取更多信息。