8

デコレーターでルートにアクセスしようとすると@auth.login_required、ユーザー名とパスワードを入力するウィンドウが表示されます。この情報を入力すると、関数のパラメータusername_or_tokenとは になります。データが空なのはなぜですか?passwordverify_password''

@auth.verify_password
def verify_password(username_or_token, password):
    # first try to authenticate by token
    user = USER.verify_auth_token(username_or_token)
    logger.debug("user = %r", user)
    logger.debug("Entered USEREMAIL = %r" ,  username_or_token)
    logger.debug("entered password = %r" ,  password)

    if not user:
        # try to authenticate with username/password
        user = session.query(USER).filter_by(USEREMAIL=username_or_token).first()   
        if not user or not user.verify_password(password):
            return False
    g.user = user
    return True

アップデート

コードを次のように簡略化しました。

@auth.verify_password
def verify_password(username, password):
    logger.debug("username = %s" % username)
    logger.debug("password = %s" % password)
    return true


@app.route('/api/token')
@auth.login_required
def get_auth_token():
    return "Hello, %s!" % auth.username()

を使用してこの機能をテストしていAdvanced Rest Clientます。

http://localhost:8081/myapp/api/token

Authorizationヘッダーも付けました。

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36
Authorization: Basic YXNkOmFzZA==
Accept: */*
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh-TW;q=0.4

これにより、次の出力が得られます。

Hello, !

ログ ファイル:

username = 
password = 

また、入力を求められることもありませsecurity credentialsん。

もう 1 つの奇妙な点は、 return をfalseinに変更してもverify_password、同じ出力が得られることです。Hello, !

4

5 に答える 5

7

OPと同じような経験をしました。mod_wsgi で実行している場合は、ここに記載WSGIPassAuthorization Onされているように設定してください。

于 2015-04-17T16:37:41.890 に答える
5

この最小限の例でユーザー名とパスワードを取得できました。

from flask import Flask
from flask.ext.httpauth import HTTPBasicAuth

app = Flask(__name__)
auth = HTTPBasicAuth()

@auth.verify_password
def foo(username, password):
    print "verifying...."
    print username
    print password
    return False

@app.route('/')
@auth.login_required
def index():
    return "Hello, %s!" % auth.username()

if __name__ == '__main__':
    app.run()

ただし、それに取り組んでいる間、クロムは Cookie を保存し、自動的に認証されていたため、Cookie を含むすべてのキャッシュを削除する必要がありました。多分これはあなたに問題を引き起こす可能性があります.

また、デコレータでマーク@app.route("/")することを忘れないでください。@auth.login_requiredそれ以外の場合、verify_password コールバックは呼び出されません。

于 2015-03-13T09:10:18.817 に答える