は、ここで私は私の検索を通じて
を思い付いたのはかなり固体実装だ、私はオンライン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()ログインの試行に異なる応答が必要な場合は、修正してください。ブルートフォース攻撃やリダイレクトを防ぐための人為的な遅延など。
これは、dev .appspot.comのサイトを見つけていないユーザーに頼っているということではありませんか?誰かがそれを見つけたら、彼らはそれの前に基本的な認証層を持たずにそれにアクセスすることができます。 –