Django Rest Framework и аутентификация Angularjs - PullRequest
0 голосов
/ 16 сентября 2018

У меня проблема с аутентификацией сгенерированного Django REST API.Передний конец отделен от бэкэнда.внешний интерфейс работает на сервере с портом 8008, а внутренний - на Django 8000. Проблема в том, что я добавил параметры CORS в файл setting.py, и у меня проблема в том, что API работает нормально, за исключением случаев, когда я хочу получить доступ к данным, требующим аутентификации.Это представление класса аутентификации:

class LoginView(APIView):
permission_classes = (AllowAny,)

def get(self, request, format=None):
    print('executed scc!!!')
    content = {
        'status': 'request was permitted'
    }

    return Response(content)

def post(self, request):
    print('Loging in !!!')
    serializer = LoginSerializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    user = serializer.validated_data["user"]
    django_login(request, user)
    print(request.user)
    token, created = Token.objects.get_or_create(user=user)
    return Response({"token": token.key}, status=200)

Я думаю, что представление класса является правильным.И все работает нормально после отправки учетных данных пользователя скинуть пост-запрос.Моя проблема в том, что у меня есть другое представление класса, которое требует аутентификации пользователя.поэтому, когда я использую почтальон, он работает нормально, я получаю доступ к request.user и возвращает зарегистрированного пользователя.Но в коде, который я получаю, аргумент должен быть строкой, байтовоподобным объектом или числом, а не «AnonymousUser».

Нужно ли добавлять заголовки в мои HTTP-запросы?потому что я заметил, что почтальон использует куки

INSTALLED_APPS = [
'rest_framework',
'rest_framework.authtoken',
'corsheaders',
]
MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
}

CORS_ORIGIN_ALLOW_ALL = True

CORS_ALLOW_CREDENTIALS = True

CORS_ORIGIN_WHITELIST = (
    'localhost:8008',
)
CORS_ORIGIN_REGEX_WHITELIST = (
    'localhost:8008',
)

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Я решил проблему, добавив в начало:

app.config(['$httpProvider', function ($httpProvider) {
    $httpProvider.defaults.xsrfCookieName = 'csrftoken';
    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
}]);
0 голосов
/ 16 сентября 2018

Вы используете следующие аутентификации:

'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.TokenAuthentication',
    'rest_framework.authentication.BasicAuthentication',
    'rest_framework.authentication.SessionAuthentication',
),

Токен: вы должны получить токен с сервера и добавить заголовок в каждый запрос, как в этом примере (из документов):

Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b

Сеанс: с внешнего интерфейса вы должны войти в систему и получить набор файлов cookie после входа в систему.Проверьте клиент и посмотрите, являются ли sessionid и csrf зарегистрированным значением ключа в вашем файле cookie.(Используйте плагин Awesome Cookie Manager, доступный для Firefox и Chrome).csrf - это токен, необходимый для каждого опасного метода HTTP (POST, PUT, DELETE ...), и его необходимо установить в качестве файла cookie с сервера.

Basic: базовая аутентификация используется только для тестированияЯ даже не использую это в своих настройках.

Все подробности здесь: http://www.django -rest-framework.org / api-guide / authentication /

CORS настроены неправильно.

Попробуйте:

CORS_ORIGIN_ALLOW_ALL = False

# A list of regexes that match origin regex list of origin hostnames
# that are authorized to make cross-site HTTP requests
CORS_ORIGIN_REGEX_WHITELIST = (
    r'^(https?://)?(localhost|127\.0\.0\.1|0\.0\.0\.0)(:\d{4})?$',
)

# Check here: 
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials
CORS_ALLOW_CREDENTIALS = True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...