2012-05-29 8 views
7

pregunta originalCómo utilizar WSGI para redireccionar un usuario de http a https


App Engine SDK 1.6.5
Python 2.7
webapp2

he implementado esquemas para asegurar webapp2 páginas a https. El problema es que cuando un usuario va a decir http: // site/login en lugar de https: // site/login obtiene un error 404 debido a que los esquemas no reconocen la ruta.

ejemplo main.py

# Libraries 
import webapp2 

# Local Controllers 
from controllers.HomeHandler import HomeHandler 
from controllers.LoginHandler import LoginHandler 

app = webapp2.WSGIApplication([ 
    webapp2.Route(r'/', HomeHandler), 
    webapp2.Route(r'/login', LoginHandler, schemes=['https'], name='login') 
], debug=True) 

He añadido otra ruta/controlador por debajo de la ruta https para coger http solicitudes:
webapp2.Route(r'/login', RouteLogin)

RouteLogin.py

# Libraries 
import webapp2 

class RouteLogin(webapp2.RequestHandler): 
    def get(self): 
     self.redirect('https://site.appspot.com/login') 

Este obras , pero parece que debería haber una mejor manera de hacer esto. Como usar htaccess en el servidor web Apache. Esto es demasiado como un truco para mi gusto. Realmente no me gustan las URL codificadas en mi código. Sin mencionar que son 2 solicitudes que para iniciar sesión no es un gran problema, pero podría haber otros ejemplos en los que termina costando demasiado.

NOTA 1: Si está mirando esta solución, tenga en cuenta que el uso de los esquemas HTTPS también significa que no podrá usar la consola de desarrollo sin borrar el esquema o configurar una variable que configure para el desarrollo.

NOTA 2: Pude obtener una forma programática de servir HTTPS en lugar de HTTP. Estaba en el camino correcto con el comentario a continuación, pero necesita una discusión.

webapp2.uri_for('login', _scheme='https')
Esto le dará la correcta https://someapp.appspot.com/login url. Desafortunadamente no soluciona mi problema principal de cómo manejar a las personas escribiendo la URL en la barra de direcciones sin https y recibiendo un error a menos que use el hack anterior. Así que sigo buscando la forma de WSGI para enrutar las solicitudes de ingresos a HTPPS.

ediciones: Añadido Nota 1 y aclaró el título, pensé que era evidente que yo estaba usando WSGI de la fuente y no CGI.

+0

Si bien este es un problema lateral al usar 'webapp2.uri_for ('login')' tampoco genera https como la URL. Por lo tanto, me deja tratando de abordar el problema completo aún. Si el usuario no inicia los plugins de https App Engine en HTTP y los errores en/login, ya que sigue siendo http a menos que codifique el enlace o use mi hack más arriba. –

+0

¿Qué tal hacer una sustitución de cadena para reemplazar http por https? No es la mejor solución, pero al menos no es necesario codificar la URL completa – Dhara

+0

Responda la pregunta como respuesta, ya sea que la acepte o no (puede aceptar su propia respuesta, especialmente en lugar de una respuesta incorrecta, como sugiere uno de sus comentarios a continuación). – Bruno

Respuesta

1

Este es el código de trabajo que utilicé en las pruebas para esta pregunta.

Nota: El servidor web de desarrollo (a partir de este escrito v1.6.5) no soporta https para que sus rutas WSGI necesitarán los esquemas retirados para trabajar en el entorno de desarrollo. Puede volver a agregarlos antes de la implementación o crear una variable para establecer el esquema que verifica el entorno como lo hice a continuación.

Puede obtener App Engine Python para redirigir la solicitud definiendo app.yaml como:
aplicación.yaml

application: cgi-vs-wsgi 
version: 1 
runtime: python27 
api_version: 1 
threadsafe: yes 

libraries: 
- name: webapp2 
    version: latest 

handlers: 

- url: /profile 
    script: main.app 
    secure: always 

- url: /login 
    script: main.app 
    secure: always 

- url: /.* 
    script: main.app 

Luego, en main.py se puede declarar sus manipuladores de WSGI como como normal:

main.py

import webapp2 
import os 

# Models 
from models.Shout import Shout 

# Controllers 
from controllers.HomeHandler import HomeHandler 
from controllers.LoginHandler import LoginHandler 
from controllers.ProfileHandler import ProfileHandler 

if os.environ['SERVER_SOFTWARE'].startswith('Development'): 
    app_scheme = 'http' 
else: 
    app_scheme = 'https' 

app = webapp.WSGIApplication([ 
    webapp2.Route(r'/login', LoginHandler, name='login', schemes=[app_scheme]), 
    webapp2.Route(r'/profile', ProfileHandler, name='profile', schemes=[app_scheme]), 
    webapp2.Route(r'/', HomeHandler) 
], debug=True) 

He subido el código de esta aplicación a mi AE-BaseApp GitHub sienta por favor gratis para descargar y usar esto en sus aplicaciones. El código tiene licencia Apache License 2.0.

8

Establezca las URL en app.yaml, en lugar de en el código. Ver https://developers.google.com/appengine/docs/python/config/appconfig#Secure_URLs

Por ejemplo:

handlers: 

- url: /foo/.* 
    script: accounts.py 
    secure: always 

Esto redirigir HTTP a HTTPS.

+0

Lamentablemente, se trata de un método CGI y no es compatible con el uso de [Thread Safe] (https://developers.google.com/appengine/docs/python/config/appconfig#Using_Concurrent_Requests), o así lo hubiera hecho desde el comienzo. Estoy buscando el método WSGI de hacerlo si hay uno. –

+1

¿En qué parte de esa documentación dice o implica que 'secure' es incompatible con' threadsafe'? No es así, y no lo es. –

+0

@ Daniel-Roseman I [quote] (https://developers.google.com/appengine/docs/python/python27/using27#Configuring_WSGI_Script_Handlers) "Advertencia: si va a utilizar solicitudes simultáneas, debe usar manipuladores WSGI". Si coloca manejadores CGI en app.yaml cuando declara threadsafe obtiene el siguiente error. 'Error grave al cargar la configuración de la aplicación:' 'Objeto inválido:' 'threadsafe no se puede habilitar con el manejador CGI: main.py' –

Cuestiones relacionadas