2009-08-25 4 views
5

アプリエンジンのデベロッパーサーバーをセットアップして、他のユーザーがプレビューできるようにしたい。アプリエンジンのデベロッパーサーバーでのHTTP認証

私が実際にやりたいことは、そのサイトから提供されたすべてのURLに対してhttp認証を有効にすることです。私は誰もそのステージを通過せずにサービスにアクセスすることを望んでいません。もちろん、私が開発しているアプリに自分自身のhttp認証を構築することもできますが、これは完璧な解決策ではありません。なぜなら、アプリのデプロイ時にその機能は必要ないからです。

解決方法はありますか?

答えて

2

JavaまたはPythonを使用していますか?

Pythonを使用している場合は、既存のWSGIミドルウェアを使用してHTTP基本認証を処理できます。ここではいくつかのオプションがあります

2

はAppEngineのサーバにアプリケーションを配備していますが、最終的に意志とは異なるアプリケーションIDを使用しますプロダクションでの使用。そうすれば、追加の認証メカニズムを開発する必要がなくなり、devアプリケーションサーバーが複数のユーザーの負荷をどれだけうまく処理できるか心配する必要はありません。

+0

これは、dev .appspot.comのサイトを見つけていないユーザーに頼っているということではありませんか?誰かがそれを見つけたら、彼らはそれの前に基本的な認証層を持たずにそれにアクセスすることができます。 –

1

dev_appserverに一般にアクセスできないようにしないでください。それのために設計されておらず、安全ではありません。 1つの問題だけを挙げると、訪問者はあなたのホスト/ _ah/admin /に行き、あなたのデータストアを混乱させることができ、失われた理論による提案はそれを妨げません。

あなたは絶対にこれを行う必要がある場合は、認証を実装し、/ _ah URLへのアクセスをブロックし、リバースプロキシとしてApacheまたは別のWebサーバを設定します。 App Engineにそれを展開するピーターの提案は、しかし、はるかに優れたものです。

+0

そのため、私はdev_appserverが提供するすべてのものに対して、サイト全体の認証要件を実行したかったのです。 – viraptor

+0

これは、dev_appserverを必要とするものに対しては使用しないことです。 –

2

は、ここで私は私の検索を通じて

を思い付いたのはかなり固体実装だ、私はオンラインGAEのためにBasicAuthのずさん/不完全な実装のトンを発見しました。その結果、私は自分自身を書くことになった。これは私が今までに思い付くことができる最高の/最も簡単なアプローチです。

私はできるだけ薄く要求ハンドラを保つために「良いプラクティス」を検討してください。ホラー自体の定型文とコピーパスタを減らすために、私はデコレータとして認証を実装することにしました。ただ、それを使用するには、ハンドラのget /ポスト/ PUTにデコレータを添付/メソッドを削除します。例えば

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()ログインの試行に異なる応答が必要な場合は、修正してください。ブルートフォース攻撃やリダイレクトを防ぐための人為的な遅延など。