Pergunta

Quero configurar o servidor de dev mecanismo do App Engine, para que esteja disponível para outras pessoas para uma visualização.

O que eu realmente gostaria de fazer antes disso é ativar a autenticação HTTP para qualquer URL servido desse site. Não quero que ninguém acesse o serviço sem passar nesse estágio. É claro que eu poderia criar minha própria autenticação HTTP no aplicativo que estou desenvolvendo, mas essa não é uma solução perfeita, porque não preciso desse recurso quando o aplicativo é implantado.

Existe alguma boa maneira de resolvê -lo?

Foi útil?

Solução

Você está usando Java ou Python?

Se você estiver usando o Python, pode usar o middleware WSGI existente para lidar com a autenticação básica HTTP. Aqui estão algumas opções:

Outras dicas

Implante o aplicativo nos servidores AppEngine, mas use um ID de aplicativo diferente do que você acabará por usar na produção. Dessa forma, você não precisa desenvolver nenhum mecanismo de autenticação extra e não precisa se preocupar com o quão bem o servidor de aplicativos dev lidará com vários usuários no valor de carga.

Não torne o dev_appserver acessível publicamente. Não foi projetado para ele e não é seguro. Para citar apenas um problema, qualquer visitante pode ir para o seu host/_ah/admin/e mexer com seu armazenamento de dados, e as sugestões de autenticação da teoria perdida não o impedirão.

Se você absolutamente deve fazer isso, configure o Apache ou outro servidor da web como um proxy reverso, implementando autenticação e bloqueando o acesso aos URLs /_ah. A sugestão de Peter de implantá -lo no App Engine é muito melhor, no entanto.

Aqui está uma implementação bastante sólida que eu criei

Através da minha pesquisa, encontrei toneladas de implementações desleixadas/incompletas do BasicAuth para GAE online. Como resultado, acabei escrevendo o meu. Esta é a melhor/mais simples abordagem que pude criar até agora.

Considero uma 'boa prática' manter os manipuladores de solicitação o mais fino possível. Para reduzir o Boilerplate e Copypasta nos próprios manipuladores, decidi implementar a autenticação como decorador. Para usá -lo, basta conectar o decorador aos métodos Get/Post/Put/Put/Excluir do manipulador.

Por exemplo:

from decorators import basic_auth

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

Em seguida, adicione o decorador aos decoradores.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: O sublinhado duplo prefixado é usado aqui em funções que não devem ser visíveis fora do módulo 'Decoradores'.

Nesse caso, uma tentativa de login com falha simplesmente aparecerá em outra caixa de diálogo de login, estou autenticando usando uma senha armazenada em um arquivo separado.

O código é escrito para ser facilmente personalizado:

  • Modificar __basic_lookup () Se você precisar de suas senhas, é armazenado em outro lugar (Ex Tanco de Dados Ex).
  • Modificar __basic_hash () Se suas senhas forem simples ou codificadas usando um método diferente.
  • Modificar __basic_login () Se você deseja uma resposta diferente a uma tentativa de login com falha. Como um atraso artificial para evitar ataques de força bruta ou um redirecionamento.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top