Проблемы Django с мульти аутентификацией в Tasty Pie SessionAuthentication не работает

Я пытаюсь заставить 'Multi Authentication' работать в Tasty Pie. Пока что ApiKeyAuthentication() работает для выполнения внешних вызовов, но когда я использую API на своем собственном сайте Django 'SessionAuthentication' (на том же сайте, на котором размещен API), он не проходит аутентификацию, несмотря на то, что пользователь вошел в систему.

Я что-то пропустил?

Tasty Pie Doc о мульти аутентификации здесь

Мой ресурс:

class CommonMeta:
    """
    Based Mata to which all other model resources extend/inherit.
    """
    # MultiAuthentication is used here, wraps any number of other authentication classes,
    # attempting each until successfully authenticating.
    authentication = MultiAuthentication(ApiKeyAuthentication(), SessionAuthentication())
    authorization = UserObjectsOnlyAuthorization()



class ContactResource(MultipartResource, ModelResource):
    class Meta(CommonMeta):
        queryset = Contact.objects.all()
        resource_name = 'contacts'
        list_allowed_methods = ['get']
        detail_allowed_methods = ['get', 'put', 'post']
        excludes = ['id']

Мой запрос AJAX:

 $.ajax({
          url: '/api/v1/contacts/' + id + "/",
          type: 'PUT',
          data: {"company": "test"},

          // On success.
          success: function(data) {
            alert('Load was performed.');
          }

       });

    };

1 ответ

Решение

Я думаю, что это работает так, как должно, вы, возможно, только что пропустили одну важную заметку о документах Tasty Pie

It requires that the user has logged in & has an active session. 
They also must have a valid CSRF token.

Для работы SessionAuthentication необходимо передать действительный токен CSRF.

Вот пример:

Сначала настройте функцию для отправки csrftoken с каждым запросом ajax

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

Затем на вашей настройке AJAX:

 $.ajaxSetup({
            crossDomain: false, // obviates need for sameOrigin test
            beforeSend: function(xhr, settings) {
                if (!csrfSafeMethod(settings.type)) {
                    xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));
                }
            }
        });

Последнее в вашем шаблоне, не забудьте включить тег {% csrf_token %}!

Другие вопросы по тегам