Question

Je veux installer le serveur App Engine dev, afin qu'il soit disponible à d'autres personnes pour un aperçu.

Ce que je voudrais vraiment faire avant qui est activer l'authentification HTTP pour une URL servi de ce site. Je ne veux pas que quelqu'un d'accéder au service sans passer cette étape. Je pourrais bien sûr construire ma propre authentification http dans l'application que je développe, mais ce n'est pas une solution parfaite, parce que je ne ai pas besoin cette fonctionnalité lorsque l'application est déployée.

Y at-il une bonne façon de le résoudre?

Était-ce utile?

La solution

Utilisez-vous Java ou Python?

Si vous utilisez Python, vous pouvez utiliser le middleware WSGI existant pour gérer HTTP auth de base. Voici quelques options:

Autres conseils

Déployer l'application aux serveurs AppEngine, mais utiliser un autre identifiant d'application que celui que vous finirez par utiliser dans la production. De cette façon, vous ne devez pas développer un mécanisme d'authentification supplémentaire, et vous n'avez pas à vous soucier de la façon dont le serveur d'applications dev va gérer plusieurs utilisateurs d'une valeur de charge.

Ne faites pas l'dev_appserver accessible au public. Il est pas conçu pour cela, et il est pas sûr. Pour ne citer qu'un seul problème, tout visiteur peut aller à yourhost / _ah / admin / et mess avec votre datastore, et les suggestions auth par la théorie perdue ne l'empêchera pas.

Si vous devez absolument le faire, mettre en place Apache ou un autre serveur web en tant que proxy inverse, la mise en œuvre d'authentification et de bloquer l'accès à / _ah URL. La suggestion de Pierre de déployer sur App Engine est un bien meilleur, cependant.

Voici une mise en œuvre assez solide, je suis venu avec

Par ma recherche, j'ai trouvé des tonnes de mises en œuvre bâclée / incomplètes de BasicAuth pour GAE en ligne. En conséquence, je fini par écrire mon propre. Ceci est la meilleure / approche la plus simple que j'ai pu trouver jusqu'à présent.

Je considère comme une « bonne pratique » de garder les gestionnaires de demande aussi mince que possible. Pour réduire le passe-partout et copypasta dans les gestionnaires eux-mêmes, j'ai décidé de mettre en œuvre l'authentification en tant que décorateur. Pour l'utiliser simplement joindre le décorateur pour obtenir / post / de vente du gestionnaire / supprimer des méthodes.

Par exemple:

from decorators import basic_auth

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

Ensuite, ajoutez le décorateur à 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')

Note:. Double trait de soulignement préfixés sont utilisés ici sur les fonctions qui ne doit pas être visible à l'extérieur du module «décorateurs

Dans ce cas, une tentative de connexion échoué sera simplement apparaitre une autre boîte de dialogue de connexion, j'authentification en utilisant un mot de passe qui est stocké dans un fichier accounts.yaml séparé, et les mots de passe sont stockés sous une forme SHA1 hachée.

Le code est écrit pour être facilement personnalisé:

  • Modifier __ basic_lookup () si vous avez besoin de vos mots de passe sont stockés ailleurs (base de données ex).
  • Modifier __ basic_hash () si vos mots de passe sont codés à l'aide ou plaintext une autre méthode.
  • Modifier __ basic_login () si vous voulez une réponse différente à une tentative de connexion a échoué. Par exemple un retard artificiel pour prévenir les attaques de force brute ou une redirection vers.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top