2009-08-25 57 views
5

我想设置应用引擎开发服务器,以便其他人可以预览它。应用引擎开发服务器中的HTTP身份验证

我真的很想在这之前做的是启用HTTP身份验证从该网站提供的任何网址。我不希望任何人在没有通过该阶段的情况下访问该服务。我当然可以在我正在开发的应用程序中构建自己的http身份验证,但这不是一个完美的解决方案,因为在部署应用程序时我不需要该功能。

有什么好方法可以解决吗?

回答

2

您使用的是Java还是Python?

如果您使用Python,则可以使用现有的WSGI中间件来处理HTTP基本身份验证。这里有一些选择:

2

部署应用到AppEngine上的服务器,但使用不同的应用程序ID一个比你最终会用于生产。这样你就不必开发任何额外的认证机制,并且你不必担心开发应用程序服务器将如何处理多个用户负载。

+0

这是不是说您只是依靠没有人找到dev .appspot.com网站?如果有人确实找到它,那么他们可以访问它,而不必在它前面具有基本的身份验证“层”。 – 2017-04-25 11:13:52

1

不要让dev_appserver公开访问。它不是为它设计的,它不安全。为了说明一个问题,任何访问者都可以访问yourhost/_ah/admin /并且混淆你的数据存储,而通过lost-theory的认证建议不会阻止它。

如果您绝对必须这样做,请将Apache或其他网络服务器设置为反向代理,实施身份验证并阻止访问/ _ah URL。然而,彼得将其部署到App Engine的建议是一个更好的建议。

+0

这就是为什么我想要做一个站点范围的身份验证要求 - dev_appserver提供的所有内容。 – viraptor 2009-08-25 20:38:02

+0

关键是不要使用dev_appserver来处理任何需要此操作的东西。 – 2009-08-25 21:31:43

2

这里有一个非常坚实的实现我

想出了通过我的搜索,我发现吨,基本验证了GAE的草率/不完全实现在线。结果,我结束了自己的写作。这是迄今为止我能够想出的最好/最简单的方法。

我认为这是保持请求处理器尽可能瘦的“良好做法”。为了减少处理程序本身的样板和副本,我决定实现身份验证作为装饰器。要使用它只需将装饰器附加到处理程序的get/post/put/delete方法。

例如:

from decorators import basic_auth 

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

然后添加装饰到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') 

注:双下划线前缀,在此使用上的功能不应该在“装饰者”模块之外可见。

在这种情况下,失败的登录尝试将弹出另一个登录对话框,我使用存储在单独accounts.yaml文件中的密码进行身份验证,并将密码存储在SHA1哈希表中。

的代码写来轻松定制:

  • 修改__basic_lookup(),如果你需要你的密码存放在其他地方(如数据库)。
  • 修改__basic_hash()如果您的密码是明文或使用不同的方法编码。
  • 修改__basic_login()如果您想对失败的登录尝试提供不同的响应。比如防止蛮力攻击或重定向的人为延迟。