Django-rest-framework api добавляет SessionAuthentication как опциональный - PullRequest
0 голосов
/ 25 сентября 2019

Привет, у меня сейчас есть мой API, использующий этот пакет simple-JWT для аутентификации токена jwt, он отлично работал.Но теперь, когда я пытаюсь вызвать API из приложения на веб-сайте django, используя Ajax, в котором используется страница пользователя, уже вошедшего в систему, но мне все равно потребовалось использовать jwt access_token.

Мой вызов ajax от пользователя страницыуже вошли в систему:

$.ajax({
       type: "POST",
       url: "/api/add_favorite/" + property_id + "/",
       beforeSend: function (xhr) {
              xhr.setRequestHeader('Authorization', 'Bearer {{ refresh_token }}');
       },
       success: function (data) {
       if (data.code == 200) {
              alert('added to favorite');
              replace_part_1 = '<a id="mylink2" href="#" value="' + property_id +'"><i class="fas fa-heart fa-lg" style="color: red" title="Remove from favorite"></i></a>'
              $("a[value='" + property_id + "']").replaceWith(replace_part_1);
             }
       }
});

Теперь я не хочу устанавливать заголовок с авторизацией, так как на странице пользователь уже вошел в систему, так что сессия уже установлена.

Поэтому я попытался добавить аутентификацию сеанса Django в API следующим образом:

@api_view(['POST'])
@authentication_classes([SessionAuthentication, JWTAuthentication])
@permission_classes([IsAuthenticated])
def add_favorite(request, property_id):
    if request.method == 'POST':
        try:
            favorite_property = Property.objects.get(pk=property_id)
            if request.user.is_authenticated:
                login_user = request.user
                if not login_user.properties.filter(pk=property_id).exists():
                    login_user.properties.add(favorite_property)

                    return JsonResponse({'code':'200','data': favorite_property.id}, status=200)
                else:
                    return JsonResponse({'code':'404','errors': "Property already exists in favorite"}, status=404)

        except Property.DoesNotExist:
            return JsonResponse({'code':'404','errors': "Property not found"}, status=404)

Мой Ajax после удаления заголовка:

$.ajax({
       type: "POST",
       url: "/api/add_favorite/" + property_id + "/",
       },
       success: function (data) {
       if (data.code == 200) {
              alert('added to favorite');
              replace_part_1 = '<a id="mylink2" href="#" value="' + property_id +'"><i class="fas fa-heart fa-lg" style="color: red" title="Remove from favorite"></i></a>'
              $("a[value='" + property_id + "']").replaceWith(replace_part_1);
             }
       }
});

и я удалилустановить заголовок из вызова Ajax теперь я получаю код возврата 403:

Не удалось загрузить ресурс: сервер ответил со статусом 403 (Запрещено)

Мои настройки:

REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
    # 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}

Я не знаю, почему аутентификация сеанса не работает, поскольку вызов Ajax осуществляется со страницы пользователя, уже вошедшей в систему.

Спасибо за чтение!

1 Ответ

1 голос
/ 25 сентября 2019

Поскольку вы добавляете заголовок Authentication к вашим запросам ajax, Django автоматически использует TokenAuthentication, если в заголовке запроса существует Authentication.Удалите его, чтобы использовать SessionAuthentication.

При переключении на использование SessionAuthentication может возникнуть проблема в том, что Django отклонит ваши unsafe запросы, если токена CSRF нет, подробнее здесь

...