我想设置应用引擎开发服务器,以便其他人可以预览它。应用引擎开发服务器中的HTTP身份验证
我真的很想在这之前做的是启用HTTP身份验证从该网站提供的任何网址。我不希望任何人在没有通过该阶段的情况下访问该服务。我当然可以在我正在开发的应用程序中构建自己的http身份验证,但这不是一个完美的解决方案,因为在部署应用程序时我不需要该功能。
有什么好方法可以解决吗?
我想设置应用引擎开发服务器,以便其他人可以预览它。应用引擎开发服务器中的HTTP身份验证
我真的很想在这之前做的是启用HTTP身份验证从该网站提供的任何网址。我不希望任何人在没有通过该阶段的情况下访问该服务。我当然可以在我正在开发的应用程序中构建自己的http身份验证,但这不是一个完美的解决方案,因为在部署应用程序时我不需要该功能。
有什么好方法可以解决吗?
您使用的是Java还是Python?
如果您使用Python,则可以使用现有的WSGI中间件来处理HTTP基本身份验证。这里有一些选择:
部署应用到AppEngine上的服务器,但使用不同的应用程序ID一个比你最终会用于生产。这样你就不必开发任何额外的认证机制,并且你不必担心开发应用程序服务器将如何处理多个用户负载。
不要让dev_appserver公开访问。它不是为它设计的,它不安全。为了说明一个问题,任何访问者都可以访问yourhost/_ah/admin /并且混淆你的数据存储,而通过lost-theory的认证建议不会阻止它。
如果您绝对必须这样做,请将Apache或其他网络服务器设置为反向代理,实施身份验证并阻止访问/ _ah URL。然而,彼得将其部署到App Engine的建议是一个更好的建议。
这就是为什么我想要做一个站点范围的身份验证要求 - dev_appserver提供的所有内容。 – viraptor 2009-08-25 20:38:02
关键是不要使用dev_appserver来处理任何需要此操作的东西。 – 2009-08-25 21:31:43
这里有一个非常坚实的实现我
想出了通过我的搜索,我发现吨,基本验证了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哈希表中。
的代码写来轻松定制:
这是不是说您只是依靠没有人找到dev .appspot.com网站?如果有人确实找到它,那么他们可以访问它,而不必在它前面具有基本的身份验证“层”。 –
2017-04-25 11:13:52