Проблемы 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 %}!