Джанго и Реакт получили 403 запрета - PullRequest
0 голосов
/ 23 декабря 2018

Я использовал приложение create-реакции-приложение в сочетании с Django Rest Framework для создания небольшого сайта.Все отлично работает, когда я использую npm start и нажимаю API Django с одного порта на другой.Однако когда я npm build статически реагирую на файлы и обслуживаю их из приложения Django, я получаю 403 forbidden при достижении нескольких конечных точек.Я думаю, что это как-то связано с CSRF, но я не могу понять, что.

Я обслуживаю статические файлы из views.py:

@api_view(['GET'])
def serve_html(request):
    try:
        with open(os.path.join(REACT_APP_DIR, 'build', 'index.html')) as f:
            return HttpResponse(f.read())
    except FileNotFoundError:
        return HttpResponse(
            """
            This URL is only used when you have built the production
            version of the app. Visit http://localhost:3000/ instead, or
            run `yarn run build` to test the production version.
            """,
            status=501,
        )

Мой urls.py содержитОбозначение статических файлов внизу:

urlpatterns = [
    # ..all api paths
    url(r'^', serve_html, name='serve_html'),
]

Я использую TokenAuthentication и SessionAuthentication:

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

И запросы API, требующие входа пользователей, имеютследующие декораторы:

@authentication_classes((SessionAuthentication, TokenAuthentication))
@permission_classes((IsAuthenticated,))

Приложение: Я замечаю, что при запуске его из кросс-источника, нет файла cookie sessionid (и все работает), но когда я пытаюсь хост реагироватьфайлы того же происхождения, есть файл cookie sessionid (и возвращается 403 Forbidden).

Извините за открытый вопрос, но я нахожусь в тупике;Я действительно не знаю, почему это не работает.

1 Ответ

0 голосов
/ 23 декабря 2018

Вам не нужен класс SessionAuthentication, так как вы используете схему HTTP-аутентификации на основе токенов.Это должно сработать:

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...