2009-08-25 9 views
5

Quiero configurar el servidor de desarrollo de motores de aplicaciones, para que esté disponible para otras personas para obtener una vista previa.Autenticación HTTP en el servidor de desarrollo del motor de aplicaciones

Lo que realmente me gustaría hacer antes es habilitar la autenticación HTTP para cualquier url que se sirva desde ese sitio. No quiero que nadie acceda al servicio sin pasar esa etapa. Por supuesto, podría construir mi propia autenticación http en la aplicación que estoy desarrollando, pero esa no es la solución perfecta, porque no necesito esa característica cuando se implementa la aplicación.

¿Hay alguna buena manera de solucionarlo?

Respuesta

2

¿Estás usando Java o Python?

Si está utilizando Python, puede usar el middleware WSGI existente para manejar la autenticación básica de HTTP. Aquí están algunas opciones:

2

desplegar el aplicación a los servidores de App Engine, pero el uso de una diferente ID de aplicación que la que es muy probable que uso en producción De esta forma, no tiene que desarrollar ningún mecanismo de autenticación adicional, y no tiene que preocuparse de qué tan bien manejará el servidor de la aplicación dev múltiples usuarios con valor de carga.

+0

¿Esto no significa que simplemente no confíes en que nadie encuentre el sitio dev .appspot.com? Si alguien lo encuentra, entonces puede acceder a él sin tener la 'capa' de autenticación básica frente a él. –

1

No haga que el dev_appserver sea de acceso público. No está diseñado para eso, y no es seguro. Para nombrar solo un problema, cualquier visitante puede ir a yourhost/_ah/admin/y meterse con su almacén de datos, y las sugerencias de autenticación de la teoría de la pérdida no lo evitarán.

Si debe hacerlo, configure Apache u otro servidor web como un proxy inverso, implementando autenticación y bloqueando el acceso a/_ah URLs. Sin embargo, la sugerencia de Peter de implementarlo en App Engine es mucho mejor.

+0

Es por eso que quería hacer un requisito de autenticación en todo el sitio, para todo lo que dev_appserver proporciona. – viraptor

+0

El punto es _no_ usar dev_appserver para nada que lo requiera. –

2

Aquí hay una aplicación bastante sólido que se me ocurrió

A través de mi búsqueda, me encontré con un montón de implementaciones descuidados/incompletas de BasicAuth para GAE en línea. Como resultado, terminé escribiendo el mío. Este es el mejor/más simple enfoque que he podido proponer hasta ahora.

Considero una 'buena práctica' mantener los manejadores de solicitudes lo más delgados posible. Para reducir los estándares y copypasta en los manejadores, decidí implementar la autenticación como decorador. Para usarlo, simplemente conecte el decorador a los métodos get/post/put/delete del manejador.

Por ejemplo:

from decorators import basic_auth 

class Handler(webapp2.RequestHandler): 
    @basic_auth 
    def get(self): 
    # load your page here 

A continuación, agregue el decorador a decorators.py:

import base64 
import os 
from webapp2_extras import security 
import yaml 

def basic_auth(func): 
    def callf(webappRequest, *args, **kwargs): 
    # Parse the header to extract a user/password combo. 
    auth_header = webappRequest.request.headers.get('Authorization') 
    # if the auth header is missing popup a login dialog 
    if auth_header == None: 
     __basic_login(webappRequest) 
    else: 
     (username, password) = base64.b64decode(auth_header.split(' ')[1]).split(':') 
     if(__basic_lookup(username) == __basic_hash(password)): 
     return func(webappRequest, *args, **kwargs) 
     else: 
     __basic_login(webappRequest) 
    return callf 

def __basic_login(webappRequest): 
    webappRequest.response.set_status(401, message="Authorization Required") 
    webappRequest.response.headers['WWW-Authenticate'] = 'Basic realm="Secure Area"' 

def __basic_lookup(username): 
    accounts_file = os.getcwd() + os.sep + 'app' + os.sep + 'accounts.yaml' 
    stream = file(accounts_file, 'r') 
    for account in yaml.load(stream): 
    if account['username'] == username: 
     return account['password'] 

def __basic_hash(password): 
    return security.hash_password(password, method='sha1') 

Nota: el prefijo subrayado doble se utilizan aquí en funciones que no deben estar visible fuera del módulo 'decoradores'.

En este caso, un intento de inicio de sesión fallido simplemente popup otro cuadro de diálogo de inicio de sesión, estoy usando la autenticación de una contraseña que se almacena en un archivo separado accounts.yaml, y las contraseñas se almacenan en una forma SHA1 hash.

El código está escrito para personalizar fácilmente:

  • Modificar __basic_lookup() si necesita que sus contraseñas se almacenan en otro lugar (base de datos ex).
  • Modificar __basic_hash() si sus contraseñas son de texto plano o codificadas con un método diferente.
  • Modifique __basic_login() si desea una respuesta diferente a un intento fallido de inicio de sesión. Tales como un retraso artificial para prevenir ataques de fuerza bruta o un redireccionamiento.
Cuestiones relacionadas