2009-08-25 35 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()如果您想對失敗的登錄嘗試提供不同的響應。比如防止蠻力攻擊或重定向的人爲延遲。