Pregunta

Quiero fijar el servidor dev motor de aplicación, por lo que está disponible a otras personas para una vista previa.

Lo que realmente me gustaría hacer antes de que sea habilitar la autenticación HTTP para cualquier URL sirve a partir de ese sitio. No quiero que nadie tenga acceso al servicio sin pasar por esa fase. Podría construir por supuesto mi propia autenticación HTTP en la aplicación que estoy desarrollando, pero eso no es una solución perfecta, porque no necesito esa característica cuando se despliega la aplicación.

¿Hay alguna buena manera de resolverlo?

¿Fue útil?

Solución

¿Está utilizando Java o Python?

Si estás usando Python, puede utilizar el middleware WSGI existentes para manejar HTTP de autenticación básica. Aquí están algunas opciones:

Otros consejos

Implementar la aplicación a los servidores de App Engine, pero el uso de una diferente ID de la aplicación a la que va a utilizar el tiempo en la producción. De esa manera usted no tiene que desarrollar cualquier mecanismo de autenticación adicional, y usted no tiene que preocuparse acerca de lo bien que el servidor de aplicaciones dev manejará múltiples usuarios por un valor de carga.

No cometa el dev_appserver públicamente accesible. No está diseñado para ello, y no es seguro. Para citar sólo un problema, cualquier visitante puede ir a yourhost / _ah / admin / y meterse con su almacén de datos y las sugerencias de autenticación por la teoría perdido no lo impedirá.

Si es absolutamente necesario hacer esto, configurar Apache u otro servidor web como un proxy inverso, la implementación de la autenticación y el bloqueo del acceso a / _ah URL. sugerencia de su despliegue en App Engine de Peter es una mucho mejor, sin embargo.

He aquí 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é de escribir mi propia. Este es el mejor enfoque / más simple que he podido llegar a hasta el momento.

Considero que es una 'buena práctica' para mantener controladores de solicitudes lo más fina posible. Para reducir el repetitivo y copypasta en los mismos manipuladores decidí implementar la autenticación como decorador. Para usarlo solo conectar el decorador para el manejador de GET / POST / PUT / borrar métodos.

Por ejemplo:

from decorators import basic_auth

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

A continuación, añadir 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:. Subrayado doble prefijado se utilizan aquí en funciones que no debe ser 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 ser fácilmente personalizado:

  • 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 claro o codificado utilizando un método diferente.
  • Modificar __ basic_login () si desea una respuesta diferente a un intento de inicio de sesión fallido. Tales como un retraso artificial para evitar ataques de fuerza bruta, o una redirección.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top