Forum

Need some help? Ask our community for its assistance!

You are not logged in.

#1 04-05-2012 12:17:01

coenonympha
Membre
Registered: 23-10-2011
Posts: 9

Django et SSL

Bonjour,

je suis actuellement en train d'essayer de déployer une application Django qui utilise HTTP et HTTPS suivant si on est dans l'interface client ou pas.

Le problème c'est que mes redirections vers HTTPS occasionnent des redirections infinies qui font planter l'application. Je ne sais pas d'où cela peut venir. J'ai essayé d'utiliser différents Middlewares, decorators mais rien n'y fait, j'ai toujours le même souci.

J'ai lu qu'il fallait utiliser django avec mod wsgi ou Nginx pour faire fonctionner correctement la fonction request.is_secure() de Django. Est ce vrai ? Je fais actuellement tourner mon application en FastCGI comme spécifié dans votre wiki. Avez vous une idée de comment je dois m'y prendre pour faire tourner l'application en mod wsgi ou avec Nginx ?

Je précise que j'ai déjà un certificat SSL et une IP dédiée sur le sous domaine sur lequel je travaille, cela ne vient donc a priori pas de cela.

J'espère que vous pourrez m'aider, merci par avance.

Offline

#2 04-05-2012 12:49:39

@Cyril
Staff
From: Paris
Registered: 06-02-2007
Posts: 5,678
Website

Re: Django et SSL

Bonjour,

Depuis Django 1.4, is_secure fonctionne normalement sur nos serveurs. Avec les versions antérieures, vous pouvez utiliser django-heroism.

Offline

#3 04-05-2012 13:43:56

coenonympha
Membre
Registered: 23-10-2011
Posts: 9

Re: Django et SSL

Merci pour votre réponse rapide.

Je vais essayer de passer à la version 1.4 pour voir si cela résout le problème car Heroism semble travailler avec Nginx, ce qui ne correspond pas à mon architecture actuelle.

Je reviendrai vers vous pour vous faire part de l'avancée de mon problème, merci encore.

Offline

#4 05-05-2012 15:00:14

coenonympha
Membre
Registered: 23-10-2011
Posts: 9

Re: Django et SSL

Bonjour,

je suis passé sous Django 1.4 et la fonction is_secure() ne daigne toujours pas fonctionner... Avez vous une solution à me proposer ?

Offline

#5 05-05-2012 15:19:34

coenonympha
Membre
Registered: 23-10-2011
Posts: 9

Re: Django et SSL

Même en simplifiant au maximum mon decorator (en enlevant le test is_secure()), le serveur ne semble pas supporter mes redirections.

Voici mon decorator :

def secure_required(view_func):
    """Decorator makes sure URL is accessed over https."""
    def _wrapped_view_func(request, *args, **kwargs):
        request_url = request.build_absolute_uri(request.get_full_path())
        if 'http' in request_url:
            if getattr(settings, 'HTTPS_SUPPORT', True):
                secure_url = request_url.replace('http://', 'https://')
                return HttpResponseRedirect(secure_url)
        return view_func(request, *args, **kwargs)
    return _wrapped_view_func

Chrome ou tout autre navigateur me donne l'erreur suivante : Cette page Web présente une boucle de redirection. .

Si je rentre directement mon url avec HTTPS, je peux y accéder sans souci, mais dès qu'il s'agit de faire une redirection vers une URL en HTTPS lorsqu'une vue est appelée en HTTP, cela ne fonctionne pas.

D'où cela peut venir ?

Offline

#6 06-05-2012 05:05:22

mikolune
Membre
Registered: 06-12-2011
Posts: 55

Re: Django et SSL

Il semble que votre test:

  if 'http' in request_url: 

est toujours True, meme quand https est utilise,  car 'http' in 'https' est True.

If faut revoir votre test, peut-etre qq chose du genre:

 if request_url.startswith("http:"):

Last edited by mikolune (06-05-2012 05:08:32)

Offline

#7 06-05-2012 12:10:00

coenonympha
Membre
Registered: 23-10-2011
Posts: 9

Re: Django et SSL

Merci pour votre réponse,

cela aurait pu être l'origine du problème. Mais le request_url ne commencera jamais par https, j'ai testé ce matin, même si on appelle la page en https, la request_url commencera toujours par "http". Du coup, ma méthode n'était pas viable.

J'ai également essayé de retester is_secure() et cette fois-ci c'est sûr : sur mon appli, elle renvoie toujours False, si quelqu'un sait pourquoi, je suis preneur.

Du coup j'ai bidouillé un truc qui fonctionne qui consiste à tester un Header appelé "HTTP_X_FORWARDED_PROTO" et cela marche sur mon hébergement Alwaysdata en fastCGI.

Au cas où des gens auraient rencontré le même problème que moi, je poste ici ma solution de decorator qui fonctionne :

def secure_required(view_func):
    """Decorator makes sure URL is accessed over https."""
    def _wrapped_view_func(request, *args, **kwargs):
        if request.is_secure() or request.META.get("HTTP_X_FORWARDED_PROTO", "") == 'https':
            return view_func(request, *args, **kwargs)
        if getattr(settings, 'HTTPS_SUPPORT', True):
            request_url = request.build_absolute_uri(request.get_full_path())
            secure_url = request_url.replace('http://', 'https://')
            return HttpResponseRedirect(secure_url)
        return view_func(request, *args, **kwargs)
    return _wrapped_view_func

J'ai laissé dedans le test is_secure() au cas où celui-ci daignerait fonctionner dans le futur. Si jamais certains passent par ici et voient une faille dans mon decorator, n'hésitez pas à m'en faire part.

Offline

#8 07-05-2012 19:08:30

@Cyril
Staff
From: Paris
Registered: 06-02-2007
Posts: 5,678
Website

Re: Django et SSL

J'ai oublié de préciser : pour Django 1.4, vous devez ajouter à votre settings.py la nouvelle configuration :

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')

Offline

#9 10-09-2020 10:55:14

borsltd
Membre
Registered: 08-05-2014
Posts: 19

Re: Django et SSL

Bonjour, je déterre ce vieux thread mais après test, le nom exact de l'en-tête est

HTTP_X_FORWARDED_PROTO

.

Je me suis rendu compte que j'avais des mélanges avec

HTTP_X_REAL_SCHEME

dans d'autres projets, pas bien !

Offline

Board footer

Powered by FluxBB