2012-05-29 12 views
7

domanda inizialeCome utilizzare WSGI per reindirizzare un utente da HTTP a HTTPS


App SDK 1.6.5 Engine
Python 2.7
webapp2

ho implementato schemi webapp2 per garantire pagine a https. Il problema è che quando un utente va a dire http: // site/login invece di https: // site/login ottengono un errore 404 a causa degli schemi che non riconoscono il percorso.

esempio 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) 

Ho aggiunto un altro itinerario/regolatore al di sotto del percorso https per la cattura http richieste:
webapp2.Route(r'/login', RouteLogin)

RouteLogin.py

# Libraries 
import webapp2 

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

questo funziona , ma sembra che ci dovrebbe essere un modo migliore per farlo. Come usare htaccess sul server web Apache. Questo è troppo simile a un trucco per i miei gusti. Non mi piacciono davvero gli URL codificati nel mio codice. Per non parlare del fatto che sono 2 richieste che per il login non sono un grosso problema, ma potrebbero esserci altri esempi in cui finisce per costare troppo.

NOTA 1: Se si sta osservando questa soluzione, tenere presente che l'utilizzo degli schemi HTTPS significa anche che non sarà possibile utilizzare la console di sviluppo senza eliminare lo SCHEME o configurare una variabile impostata per dev.

NOTA 2: Sono riuscito a ottenere un modo programmatico per servire HTTPS anziché HTTP. Ero sulla strada giusta con il commento qui sotto, ma ha bisogno di una discussione.

webapp2.uri_for('login', _scheme='https')
Questo ti darà l'URL corretto https://someapp.appspot.com/login. Sfortunatamente non si occupa del mio problema principale su come gestire le persone che digitano l'url nella barra degli indirizzi senza https e ricevendo un errore a meno che non utilizzi l'hack sopra. Quindi sto ancora cercando il modo WSGI per indirizzare le richieste di reddito a HTPPS.

Modifiche: Aggiunta la Nota 1 e chiarito il titolo, ho pensato che fosse evidente che stavo usando WSGI dal sorgente e non da CGI.

+0

Mentre questo è un problema collaterale che utilizza 'webapp2.uri_for ('login')' non genera https come l'URL. Quindi mi lascia cercando di affrontare ancora il problema completo. Se l'utente non avvia i plug-in del motore app https lungo in HTTP e gli errori su/login poiché è ancora http, a meno che non venga codificato il link o non si utilizzi il mio hack in alto. –

+0

Come si fa una sostituzione di stringa per sostituire http con https? Non è la soluzione migliore, ma almeno in questo modo non è necessario codificare l'intero URL – Dhara

+0

Si prega di inviare la risposta alla tua domanda come risposta, che tu accetti o meno (puoi accettare la tua risposta, in particolare invece di una risposta sbagliata, come suggerisce uno dei tuoi commenti qui sotto). – Bruno

risposta

1

Questo è il codice di lavoro che ho utilizzato per il test per questa domanda.

Nota: il server Web di sviluppo (al momento della stesura di questa v1.6.5) non supporta https in modo che le rotte WSGI abbiano bisogno degli schemi rimossi per funzionare nell'ambiente di sviluppo. È possibile aggiungerli prima della distribuzione o creare una variabile per impostare lo schema che controlla l'ambiente come ho fatto di seguito.

È possibile ottenere App Engine Python per reindirizzare la richiesta definendo app.yaml come:
app.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 

Poi nel main.py si può dichiarare i gestori WSGI come come normale:

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) 

Ho caricato il codice per questa applicazione alla mia AE-BaseApp GitHub esitate libero di scaricarlo e usarlo nelle tue applicazioni. Il codice è concesso in licenza Apache License 2.0.

8

Impostare gli URL in app.yaml anziché nel codice. Vedere https://developers.google.com/appengine/docs/python/config/appconfig#Secure_URLs

Ad esempio:

handlers: 

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

Questo reindirizzerà HTTP ad HTTPS.

+0

Sfortunatamente questo è un metodo CGI ed è incompatibile con l'uso di [Thread Safe] (https://developers.google.com/appengine/docs/python/config/appconfig#Using_Concurrent_Requests), o è così che l'avrei fatto da la partenza. Sto cercando il metodo WSGI per farlo se ce n'è uno. –

+1

Dove in quella documentazione dice o sottintende che 'secure' è incompatibile con' threadsafe'? Non lo è, e non lo è. –

+0

@ Daniel-Roseman I [quote] (https://developers.google.com/appengine/docs/python/python27/using27#Configuring_WSGI_Script_Handlers) "Attenzione: se si intende utilizzare richieste simultanee, è necessario utilizzare gestori WSGI." Se metti i gestori CGI in app.yaml quando dichiari threadsafe ottieni il seguente errore. Errore irreversibile durante il caricamento della configurazione dell'applicazione: ' ' Oggetto non valido: ' ' impossibile abilitare il thread safe con il gestore CGI: main.py' –

Problemi correlati