我想設置應用引擎開發服務器,以便其他人可以預覽它。應用引擎開發服務器中的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