анонимный пользователь django angular

Я отправляю запрос $http get от моего углового клиента на мой бэкэнд Django, где (request.user) дает мне Anonymous. Из-за этого я могу делать что угодно на стороне сервера.

Я использую django-rest-auth на стороне django и angular-django-registration-auth на стороне клиента для аутентификации. Сама аутентификация прошла успешно - я могу войти в систему и получить имя пользователя, идентификатор электронной почты на стороне клиента, отправленный с сервера.

Мой запрос выглядит следующим образом:

 var url = "http://localhost:8000/api/exercises/get_exercise/" + exerciseType + "/";

   $http({
            url: url,
            method: 'GET',
            headers: {'X-CSRFToken': $cookies['csrftoken']}
        })

          .success(function(response){

            console.log(response);

           });
      }) 

В моей конфигурации приложения я добавил следующую строку:

$httpProvider.defaults.withCredentials = this.use_session;

Заголовки запросов, как видно из моей консоли браузера Chrome, выглядят следующим образом:

Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4,en-GB;q=0.2
Authorization:Token eb979cb6f179dd2d9056023685e2d02e4e65a58e
Connection:keep-alive
Host:localhost:8000
Origin:http://localhost:8100
Referer:http://localhost:8100/
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36

Если я нажму тот же URL-адрес из конечной точки API django непосредственно на 'http://127.0.0.1:8000/api/exercises/get_exercise/2/', где работает мой сервер django, успешно, и заголовки запросов выглядят следующим образом:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4,en-GB;q=0.2
Cache-Control:max-age=0
Connection:keep-alive
Cookie:csrftoken=GDco30gJ9vki6LDtqJSuQh9hGB0aXp84;     sessionid=94xfwx9zvr4pgd1wx9r0nemjwmy3mowi
Host:127.0.0.1:8000
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36

Разница, которую я вижу, заключается в том, что успешный запрос отправляет файлы cookie и информацию о сеансе, тогда как в запросе, отправленном из моего приложения angular, он отсутствует.

В чем причина и обходной путь?

Мой Django settings.py имеет следующее:

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.BasicAuthentication',
    'rest_framework.authentication.SessionAuthentication',
    'rest_framework.authentication.TokenAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticated',
),

}

Мое представление django выглядит следующим образом:

from django.contrib.auth.models import User
from rest_framework.authentication import TokenAuthentication,     SessionAuthentication, BasicAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.decorators import api_view
from rest_framework.decorators import authentication_classes
from rest_framework.decorators import permission_classes 

class JSONResponse(HttpResponse):
authentication_classes = (SessionAuthentication, BasicAuthentication)
permission_classes = (IsAuthenticated,)
"""
An HttpResponse that renders its content into JSON.
"""
def __init__(self, data, **kwargs):
    content = JSONRenderer().render(data)
    kwargs['content_type'] = 'application/json'
    super(JSONResponse, self).__init__(content, **kwargs)

#view to get a specific exercise for a particular user
def get_single_exercise_for_user_id(request, exerciseId):

  results = Exercise_state_ui_model.fetch_exercises(request.user.id, exerciseId)

  serializer = ExerciseStateSerializer(results, many=True)
  return JSONResponse(serializer.data)

person Thinker    schedule 29.03.2016    source источник


Ответы (1)


Authorization:Token eb979cb6f179dd2d9056023685e2d02e4e65a58e

Заставляет меня думать, что вам нужно включить аутентификацию токена в этом представлении.

#view to get a specific exercise for a particular user
@api_view(('GET',))
def get_single_exercise_for_user_id(request, exerciseId):

     results = Exercise_state_ui_model.fetch_exercises(request.user.id, exerciseId)

     serializer = ExerciseStateSerializer(results, many=True)
     return Response(serializer.data)
person kevswanberg    schedule 29.03.2016
comment
Я обновил свой вопрос фрагментами из моих settings.py и views.py. Можете посмотреть, если чего-то не хватает? - person Thinker; 30.03.2016
comment
Вам нужно украсить этот вид. Также удалите этот ответ JSON, пусть rest_framework решит, какой контент он возвращает, в зависимости от того, что запрашивает клиент. - person kevswanberg; 30.03.2016
comment
Потрясающий! ваше решение сработало!! Я потратил два дня на поиск всех возможных причин! Большое спасибо! - person Thinker; 30.03.2016