login do manipulador app.yaml: a opção admin não é eficaz no aplicativo GAE padrão python env?
Eu estava trabalhando em algumas verificações de segurança para meu aplicativo GAE env python padrão e fiquei surpreso ao ver que ologin: admin
opção parece não ser eficaz.
Desejo proteger uma parte de um namespace de solicitação apenas para o aplicativo em si, não para solicitações externas. O aplicativo envia essas solicitações por meio de uma fila de tarefas push.
Esta é a respectiva configuração do manipulador, que eu verifiquei no StackDriver para ser o código real que tratou da solicitação específica em questão:
- url: /ci/ci_msg* # external requests OK
script: apartci.app
secure: always
- url: /ci/.* # internal requests only
script: apartci.app
secure: always
login: admin
Este é o código do manipulador, hackeado para registrar um erro e verificar se a solicitação realmente atinge o código do aplicativo, também verificado no StackDriver como o código de manipulação real:
def post(self):
logging.error('in post')
self.handle_post()
Enviei a solicitação externa para o mesmo caminho exato em que somente as solicitações internas da fila de tarefas devem ser aceitas, usando o complemento Firefox HttpRequester. O corpo da solicitação falhou nas verificações adicionaisself.handle_post()
, mas isso é irrelevante para esta pergunta.
A resposta que recebi no HttpRequester (também bastante irrelevante):
<html>
<head>
<title>203 Non-Authoritative Information</title>
</head>
<body>
<h1>203 Non-Authoritative Information</h1>
<br /><br />
</body>
</html>
Eu verifiquei os logs do aplicativo no StackDriver. Para minha surpresa, encontrei ologging.error('in post')
log de aplicativo do meu manipuladorpost()
método anexado ao log de solicitação, indicando que a solicitação chegou ao meu aplicativo:
Para comparação - o log da mesma solicitação enviada pelo próprio aplicativo (coincidentemente, apenas ~ 1 segundo antes do externo e manipulado exatamente pela mesma instância - o que contribuiu para minha confusão):
Minha expectativa era que a solicitação externa não chegasse ao código do manipulador, de acordo com a linha de login emElemento manipuladores:
admin
Como comrequeridos, executaauth_fail_action se o usuário não estiver conectado. Além disso, se o usuário não for administrador do aplicativo, ele receberá uma mensagem de erro, independentemente daauth_fail_action configuração. Se o usuário for um administrador, o manipulador continuará.
Quando um manipulador de URL com umConecte-se configuração diferente deopcional corresponde a um URL, o manipulador primeiro verifica se o usuário fez login no aplicativo usando seuopção de autenticação. Caso contrário, por padrão, o usuário é redirecionado para a página de entrada. Você também pode usarauth_fail_action para configurar o aplicativo para simplesmente rejeitar solicitações de manipulador de usuários que não estão devidamente autenticados, em vez de redirecionar o usuário para a página de entrada.
Note oadmin a restrição de login também é atendida para solicitações internas para as quais o Google App Engine defineX-Appengine cabeçalhos especiais. Por exemplo,cron tarefas agendadas atendem àsadmin restrição, porque o App Engine define um cabeçalho HTTPX-AppEngine-Cron: true nos respectivos pedidos. No entanto, os pedidos seriamnão satisfazer orequeridos restrição de login, porque as tarefas agendadas cron não são executadas como qualquer usuário.
Então, minha pergunta é por que / como a solicitação externa conseguiu acessar o código do manipulador? Estou esquecendo de algo?