CSRF在使用邮递员测试django时很容易

时间:2017-03-26 10:31:43

标签: django django-rest-framework django-authentication django-csrf

我有一个django(rest_framework)应用程序,我在其中添加了一些身份验证。创建一个帐户并使用该帐户登录第一次进行得很顺利,但麻烦就开始了。

现在,无论何时尝试注册/登录/注销,我都会立即收到错误消息,指出csrf验证失败或令牌丢失。

所以我开始找出它的含义并得出结论认为它对认证非常重要。我不清楚如何在不损害安全性的情况下使应用程序身份验证系统正常工作。

有人可以向我解释如何在不损害csrf令牌的情况下与我的应用程序进行通信。 (例如在邮递员中) 提前谢谢!

我的代码非常标准的django身份验证代码

authentication = [ 
    url(r'^status/$', StatusView.as_view()),
    url(r'^register/$', RegisterView.as_view()),
    url(r'^login/$', LoginView.as_view()),
    url(r'^logout/$', LogoutView.as_view()),
]

--- views.py ---------------

class RegisterView(APIView):
def post(self, request: Request):
    acc = authentication.AccountSerializer(data=request.data)
    helper.validate_serializer(acc)
    return Response(acc.data)


class LoginView(APIView):
    def post(self, request: Request):
        username = request.data.get("username", "")
        password = request.data.get("password", "")
        user = authenticate(username=username, password=password)
        if user is not None:
            login(request, user)
            return Response({"message": "Login successful", "account": authentication.AccountSerializer(user.account).data})
        else:
            return APIException(detail={"message": "Login unsuccessful"})


class LogoutView(APIView):
    def post(self, request: Request):
        logout(request)
        return Response({"message": "Logout successful"})


class StatusView(APIView):
    def get(self, request: Request):
        if request.user.is_authenticated:
            return Response({"message": "User is authenticated"})
        else:
            return Response({"message": "User is not authenticated"})

1 个答案:

答案 0 :(得分:0)

尝试清除邮递员的cookie,然后查看。如果您的问题得到解决,请尝试不使用会话身份验证,并使用豁免csrf装饰器进行竞争(警告:豁免csrf是有风险的,但对于开发而言,您可以这样做=