Я разрабатываю одностраничное приложение в приложении AngularJS и Django Rest Framework + Django CORS Headers.
Моя проблема в том, что cookie "csrftoken" никогда не появляется в моем браузере, когда я связался с бэкэнд.
Например: я делаю логин, используя сообщение. Я получаю "sessionid" cookie правильно, но "csrftoken" никогда не появляется, и поэтому я не могу делать правильные сообщения от моего клиента, так как мне будет отказано из-за отсутствия токена csrf.
- Я проанализировал заголовки ответов из API, а csrftoken - не ther.
- Я посмотрел прямо в браузере остальных браузеров, и там он прекрасно выглядит.
- Как раз отметить, я могу сделать свой первый POST для входа, поскольку Django Rest Framework только заставляет CSRF для аутентифицированных пользователей. Если я попытаюсь переписать его, произойдет с момента появления "sessionid" -cookie.
- Я не заинтересован в обходе защиты CSRF, поскольку предлагают некоторые сообщения в stackoverflow.
Некоторые фрагменты кода с передней/внутренней стороны. Это незавершенные фрагменты, поэтому не зацикливайтесь на плохо написанном коде.
API-интерфейс Backend API LoginView
class LoginView(APIView):
renderer_classes = (JSONPRenderer, JSONRenderer)
def post(self, request, format=None):
serializer = LoginSerializer(data=request.DATA)
if serializer.is_valid():
userAuth = authenticate(username=serializer.data['username'], password=serializer.data['password'])
if userAuth:
if userAuth.is_active:
login(request, userAuth)
loggedInUser = AuthUserProfile.objects.get(pk=1)
serializer = UserProfileSerializer(loggedInUser)
user = [serializer.data, {'isLogged': True}]
else:
user = {'isLogged': False}
return Response(user, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Клиентская система управления доступом AngularJS
.controller('LoginCtrl', ['$scope', '$http', 'uService', '$rootScope', function(scope, $http, User, rootScope) {
scope.login = function() {
var config = {
method: 'POST',
withCredentials: true,
url: rootScope.apiURL+'/user/login/',
data : scope.loginForm
};
$http(config)
.success(function(data, status, headers, config) {
if (status == 200) {
console.log(data[0]); //Test code
// succefull login
User.isLogged = true;
User.username = data.username;
}
else {
console.log(data); //Test code
User.isLogged = false;
User.username = '';
}
})
.error(function(data, status, headers, config) {
console.log('Testing console error');
User.isLogged = false;
User.username = '';
});
};
}]);
Любой, у кого есть хорошие советы/идеи/примеры?