60 votes

Comment faire du python sur Heroku https uniquement?

J'ai une application python / django sur Heroku (pile de cèdre) et je souhaite la rendre accessible via https uniquement. J'ai activé l'option "ssl piggyback" et je peux me connecter via https.

Mais quel est le meilleur moyen de désactiver l'accès http ou de rediriger vers https?

67voto

Kristian Points 2705

Combinant la réponse de @CraigKerstiens et @allanlei dans quelque chose que j'ai testé et vérifié pour fonctionner. Heroku définit HTTP_X_FORWARDED_PROTO sur https lorsque request est défini sur SSL, et nous pouvons l'utiliser pour vérifier:

 from django.conf import settings
from django.http import HttpResponseRedirect


class SSLMiddleware(object):

    def process_request(self, request):
        if not any([settings.DEBUG, request.is_secure(), request.META.get("HTTP_X_FORWARDED_PROTO", "") == 'https']):
            url = request.build_absolute_uri(request.get_full_path())
            secure_url = url.replace("http://", "https://")
            return HttpResponseRedirect(secure_url)
 

54voto

shangxiao Points 97

Django 1.8 prendra en charge les redirections non HTTPS (intégrées à partir de django-secure ):

 SECURE_SSL_REDIRECT = True # [1]
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
 

[1] https://docs.djangoproject.com/en/dev/ref/settings/#secure-ssl-redirect

13voto

allanlei Points 101

Vous ne savez pas si @CraigKerstiens la réponse prend en compte que request.is_secure() retourne toujours False si derrière Heroku du reverse proxy et pas "fixe". Si je me souviens bien, ce sera la cause d'une boucle de redirection HTTP.

Si vous exécutez Django avec gunicorn, une autre façon de le faire est d'ajouter les éléments suivants à gunicorn de config

secure_scheme_headers = {
    'X-FORWARDED-PROTO': 'https'
}

Courir avec quelque chose comme ceci dans votre Procfile

web: python manage.py run_gunicorn -b 0.0.0.0:$PORT -c config/gunicorn.conf

Par la mise en gunicorn de l' secure-scheme-header, request.is_secure() bien de retour True sur les requêtes https. Voir Gunicorn Config.

Maintenant @CraigKerstiens le middleware de fonctionner correctement, y compris tous les appels à des request.is_secure() dans votre application.

Remarque: Django a aussi le même paramètre de configuration d'appel SECURE_PROXY_SSL_HEADER, mais dans le dev de la version.

6voto

CraigKerstiens Points 3614

Quel cadre utilisez-vous pour votre application? Si vous utilisez Django, vous pouvez simplement utiliser un middleware similaire à:

 import re

from django.conf import settings
from django.core import urlresolvers
from django.http import HttpResponse, HttpResponseRedirect


class SSLMiddleware(object):

    def process_request(self, request):
        if not any([settings.DEBUG, request.is_secure()]):
            url = request.build_absolute_uri(request.get_full_path())
            secure_url = url.replace("http://", "https://")
            return HttpResponseRedirect(secure_url)
 

6voto

Ryan Points 1718

Si vous utilisez Flask, cela fonctionne assez bien:

1) Faites "pip install flask-sslify"

(github est ici: https://github.com/kennethreitz/flask-sslify )

2) Inclure les lignes suivantes:

 from flask_sslify import SSLify
if 'DYNO' in os.environ: # only trigger SSLify if the app is running on Heroku
    sslify = SSLify(app)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X