我发现location.reload() 方法使我的 SPA(React+Redux 前端,DRF 后端)看起来很糟糕/笨拙,因为它会登录用户,然后刷新页面(尝试在不同的地方使用它,但它没有t 解决这个问题)。
对于我的情况,both CSRF_USE_SESSIONS and CSRF_COOKIE_HTTPONLY are set to True。
我让登录 POST 路由在响应负载中返回“csrfToken”,然后我的身份验证减速器在处理 LOGIN_SUCCESS 操作后,会将隐藏的 csrfmiddlewaretoken 输入值更新为 csrfToken,以便它可以用于任何后续请求。
由于只有成功通过登录路径才能获取令牌,所以从安全角度来看,这应该没问题。
模板:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Sample</title>
</head>
<body>
<div id="root"></div>
{% load static %}
<script>
// global vars
var CSRF_TOKEN = '{{ csrf_token }}';
</script>
<script src="{% static "frontend/main.js" %}"></script>
</body>
</html>
查看:
class LoginAPI(generics.GenericAPIView):
serializer_class = LoginSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.validated_data
login(request, user)
return Response({
'csrfToken': get_token(request) # from `django.middleware.csrf`; when called, refreshes the csrf token in the session and returns it
})
减速器:
...
case LOGIN_SUCCESS:
case REGISTER_SUCCESS:
console.log(`old CSRF_TOKEN: ${CSRF_TOKEN}`);
CSRF_TOKEN = action.payload.csrfToken;
return {
...state,
isAuthenticated: true,
isLoading: false
}
...