Domanda

Voglio installare il server dev App Engine, in modo che sia a disposizione di altre persone per un'anteprima.

Quello che mi piacerebbe davvero fare prima che sia abilitare l'autenticazione HTTP per qualsiasi URL servita da quel sito. Io non voglio che nessuno di usufruire del servizio senza passare quella fase. Potrei, naturalmente, costruire il mio autenticazione HTTP in app sto sviluppando, ma non è una soluzione perfetta, perché non ho bisogno di questa funzione quando l'applicazione viene distribuita.

C'è un buon modo per risolverlo?

È stato utile?

Soluzione

Stai usando Java o Python?

Se stai usando Python, è possibile utilizzare il middleware WSGI esistente per gestire autenticazione HTTP di base. Ecco alcune opzioni:

Altri suggerimenti

Distribuire l'applicazione per i server AppEngine, ma utilizzare un diverso App ID da quello che si finirà per utilizzare in produzione. In questo modo non c'è bisogno di sviluppare qualsiasi meccanismo di autenticazione in più, e non devono preoccuparsi di quanto bene il server dev app di gestire più utenti per un valore di carico.

Non fare l'dev_appserver accessibili al pubblico. Non è progettato per essa, e non è sicuro. Per citare solo un problema, ogni visitatore può andare a yourhost / _ah / admin / e la mensa con il datastore e le suggestioni auth di perso-teoria non gli impedirà.

Se si deve assolutamente fare questo, configurare Apache o un altro server web come proxy inverso, implementare l'autenticazione e bloccando l'accesso a / _ah URL. il suggerimento di Pietro di distribuirlo per App Engine è un molto meglio, però.

Ecco una bella solida implementazione sono arrivato fino a

Attraverso la mia ricerca, ho trovato tonnellate di sciatta / implementazioni incomplete di BasicAuth per GAE on-line. Di conseguenza, ho finito per scrivere il mio. Questo è l'approccio migliore / più semplice sono stato in grado di elaborare fino ad ora.

Lo considero un 'buona pratica' per mantenere gestori delle richieste più sottile possibile. Per ridurre boilerplate e copypasta nei gestori stessi, ho deciso di implementare l'autenticazione come decoratore. Per usarlo basta collegare il decoratore al conduttore get / post / put / cancellare i metodi.

Ad esempio:

from decorators import basic_auth

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

Quindi aggiungere il decoratore 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. Doppia sottolineatura prefissato sono usati qui in funzioni che non deve essere visibile al di fuori del modulo 'decoratori'

In questo caso, un tentativo di accesso non riuscito si limiterà a popup un'altra finestra di login, sto autenticazione utilizzando una password che viene memorizzato in un file accounts.yaml separato e le password vengono memorizzate in forma SHA1 hash.

Il codice è scritto per essere facilmente personalizzato:

  • Modifica __ basic_lookup () se avete bisogno le password vengono memorizzate da qualche altra parte (ex database).
  • Modifica __ basic_hash () se le password sono in chiaro o codificati usando un metodo diverso.
  • Modifica __ basic_login () se si desidera una risposta diversa a un tentativo di accesso non riuscito. Come ad esempio un ritardo artificiale per prevenire attacchi di forza bruta, o un reindirizzamento.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top