пятница, 18 декабря 2009 г.

django nginx fastcgi ssl https

Здесь представлена инструкция по тому, как настроить django+nginx+fastcgi+ssl+https
Что хотелось?
Хотелось сделать шифрование на странице логина и регистрации принудительное, а шифрование других страниц по выбору пользователя
Что надо сделать ?
  • В настройках nginx не забыть добавить параметр для fastcgi, чтобы в django можно было получать переменную os.environ['HTTPS']. Добавляется такой параметр: fastcgi_param HTTPS on;
  • В django добавляем middleware такого вида (основная реализация позаимстована отсюда: http://www.djangosnippets.org/snippets/240/):
    SSL = 'SSL'

    class SSLRedirectMiddleware(object):

    def process_view(self, request, view_func, view_args, view_kwargs):
    if SSL in view_kwargs:
    secure = view_kwargs[SSL]
    del view_kwargs[SSL]
    else:
    secure = False
    user = request.user
    if user.is_authenticated():
    try:
    profile = user.get_profile()
    secure = profile.is_secure
    except:
    pass

    if not secure == self._is_secure(request):
    return self._redirect(request, secure)

    def _is_secure(self, request):
    if request.is_secure():
    return True

    #Handle the Webfaction case until this gets resolved in the request.is_secure()
    if 'HTTP_X_FORWARDED_SSL' in request.META:
    return request.META['HTTP_X_FORWARDED_SSL'] == 'on'

    return False

    def _redirect(self, request, secure):
    protocol = secure and "https" or "http"
    newurl = "%s://%s%s" % (protocol, get_host(request), request.get_full_path())
    if settings.DEBUG and request.method == 'POST':
    raise RuntimeError, \
    """Django can't perform a SSL redirect while maintaining POST data.
    Please structure your views so that redirects only occur during GETs."""

    return HttpResponsePermanentRedirect(newurl)
  • Во views для login я указал такую функцию
    from django.views.decorators.csrf import csrf_exempt

    @csrf_exempt
    def secure_login(request, *args, **kwargs):
    return simple_login(request, *args, **kwargs)
    т.к. я не смог победить проблему совместимости csrf + https
  • Осталось только в urls.py указать
       url(r'^login/$', 'apps.accounts.views.secure_login',
    {'template_name': 'registration/login.html',
    'redirect_field_name': REDIRECT_FIELD_NAME,
    'authentication_form': AuthenticationForm, 'SSL': True},
    name='auth_login'),
    Здесь стоит обратить внимание на посылку параметра SSL=True
Это должно работать:-)

Комментариев нет:

Отправить комментарий