Frage

Ich möchte den App Engine Dev Server einrichten, damit er anderen Personen für eine Vorschau zur Verfügung steht.

Was ich vor diesem wirklich gerne tun würde, ist, die HTTP -Authentifizierung für jede URL von dieser Website zu aktivieren. Ich möchte nicht, dass jemand auf den Service zugreift, ohne diese Stufe zu bestehen. Ich könnte natürlich meine eigene HTTP -Authentifizierung in die von mir entwickelnde App aufbauen, aber das ist keine perfekte Lösung, da ich diese Funktion nicht brauche, wenn die App bereitgestellt wird.

Gibt es eine gute Möglichkeit, es zu lösen?

War es hilfreich?

Lösung

Verwenden Sie Java oder Python?

Wenn Sie Python verwenden, können Sie vorhandene WSGI Middleware verwenden, um HTTP Basic Auth zu verarbeiten. Hier sind einige Optionen:

Andere Tipps

Stellen Sie die App auf den AppEngine -Servern bereit, verwenden Sie jedoch eine andere App -ID als die, die Sie schließlich in der Produktion verwenden werden. Auf diese Weise müssen Sie keinen zusätzlichen Authentifizierungsmechanismus entwickeln, und Sie müssen sich keine Sorgen darüber machen, wie gut der Dev App -Server mehrere Benutzer laden.

Machen Sie den dev_appserver nicht öffentlich zugänglich. Es ist nicht dafür konzipiert und ist nicht sicher. Um nur ein Problem zu nennen, kann jeder Besucher zu Ihnen gehen/_ah/admin/und mit Ihrem Datenspeicher durcheinander bringen, und die Auth-Vorschläge von Lost-Theory werden dies nicht verhindern.

Wenn Sie dies unbedingt tun müssen, richten Sie Apache oder einen anderen Webserver als Reverse Proxy ein, implementieren Sie die Authentifizierung und blockieren Zugriff auf /_ah -URLs. Peters Vorschlag, es für App Engine bereitzustellen, ist jedoch viel besser.

Hier ist eine ziemlich solide Implementierung, die ich mir ausgedacht habe

Durch meine Suche fand ich Tonnen von schlampigen/unvollständigen Implementierungen von BasicAuth für GAE online. Infolgedessen habe ich meine eigene geschrieben. Dies ist der beste/einfachste Ansatz, den ich bisher entwickeln konnte.

Ich halte es für eine „gute Praxis“, um Anfragehandler so dünn wie möglich zu halten. Um die Kesselplatte und Copypasta in den Handlern selbst zu reduzieren, beschloss ich, die Authentifizierung als Dekorateur zu implementieren. Um es zu verwenden, befestigen Sie den Dekorator einfach an die Methoden Get/Post/Put/Löschen des Handlers.

Zum Beispiel:

from decorators import basic_auth

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

Fügen Sie dann den Dekorateur zu Dekoratoren hinzu.

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

HINWEIS: Hier werden hier für Funktionen für Funktionen verwendet, die außerhalb des Moduls "Dekorateure" nicht sichtbar sein sollten.

In diesem Fall wird ein fehlgeschlagener Anmeldeversuch einfach ein anderes Anmeldedialog mithilfe eines Kennworts, das in einer separaten Konten gespeichert wird, ein, und die Passwörter werden in einem SHA1 -Hashed -Formular gespeichert.

Der Code wird so geschrieben, dass er leicht angepasst werden kann:

  • Ändern __basic_lookup () Wenn Sie Ihre Passwörter benötigen, werden sie woanders gespeichert (Ex -Datenbank).
  • Ändern __basic_hash () Wenn Ihre Passwörter klärentext oder mit einer anderen Methode codiert werden.
  • Ändern __basic_login () Wenn Sie eine andere Antwort auf einen fehlgeschlagenen Anmeldeversuch wünschen. Wie eine künstliche Verzögerung, um Brute-Force-Angriffe oder eine Umleitung zu verhindern.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top