Django 1.5, CSRF, вход и клиенти, които не позволяват бисквитки

Основният проблем е следният: когато потребители, които не разрешават бисквитки, се опитат да влязат в моя сайт Django, те получават CSRF грешка и се пренасочват към страница 403 Forbidden. Би било много по-добре, ако получат съобщение, което им казва, че трябва да разрешат бисквитките.

Мисля да се справя с това, като настроя CSRF_FAILURE_VIEW и просто покажа страница, която казва, че са необходими бисквитки. Предположението е, че единственият начин легитимен потребител да получи CSRF грешка е като не разреши бисквитки.

Въпреки това, когато гледам кода на Django, изглежда, че е възможно да се покаже грешка без бисквитки във формуляра за влизане. Ето чистия метод на django.contrib.auth.forms.AuthenticationForm:

def clean(self):
    username = self.cleaned_data.get('username')
    password = self.cleaned_data.get('password')

    if username and password:
        self.user_cache = authenticate(username=username,
                                       password=password)
        if self.user_cache is None:
            raise forms.ValidationError(
                self.error_messages['invalid_login'] % {
                    'username': self.username_field.verbose_name
                })
        elif not self.user_cache.is_active:
            raise forms.ValidationError(self.error_messages['inactive'])
    self.check_for_test_cookie()
    return self.cleaned_data

def check_for_test_cookie(self):
    if self.request and not self.request.session.test_cookie_worked():
        raise forms.ValidationError(self.error_messages['no_cookies'])

Изглежда, че трябва да покаже съобщение за грешка без бисквитки. Но когато стартирам с деактивирани бисквитки, CSRF грешката предотвратява изпълнението на чистия метод.

Какво ми липсва тук?

Актуализация: Опитах да настроя CSRF_FAILURE_VIEW на моя собствен манипулатор. На манипулатора се предава низ, обясняващ грешката. В този случай получавам „CSRF cookie not set.“, което е достатъчно добро, за да открие, че бисквитките са деактивирани.


person Chuck    schedule 25.02.2014    source източник
comment
Добавихте ли и контекстния процесор django.core.context_processors.csrf във вашия settings.py?   -  person Drewness    schedule 26.02.2014
comment
Благодаря. Опитах се да добавя този контекстен процесор. Няма промяна. Само за да бъде ясно, всичко работи добре, когато клиентът разреши бисквитки.   -  person Chuck    schedule 26.02.2014


Отговори (1)


Можете да направите това, като зададете тестова бисквитка.

Има го в документацията на Django как можете внедри това.

От документите на Django:

За удобство Django предоставя лесен начин за тестване дали браузърът на потребителя приема бисквитки. Просто извикайте метода set_test_cookie() на request.session в изглед и извикайте test_cookie_worked() в следващ изглед – не в същия изглед.

Което означава, че ако клиентът не е активирал бисквитките в браузъра си, вместо грешка 403 ще му бъде показано съобщение за активиране на бисквитките след като кликне върху бутон за влизане.

person xyres    schedule 21.04.2014