Flask-HTTPAuth verify_password函数未接收用户名或密码

5 python http-authentication flask flask-httpauth

当我尝试使用@auth.login_required装饰器访问路径时,系统会提示我输入用户名和密码.进入此信息后,参数username_or_token和password对verify_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
Run Code Online (Sandbox Code Playgroud)

UPDATE

我已将代码简化为:

@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()
Run Code Online (Sandbox Code Playgroud)

我正在使用测试这个功能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
Run Code Online (Sandbox Code Playgroud)

这导致输出:

Hello, !

日志文件:

username = 
password = 
Run Code Online (Sandbox Code Playgroud)

我也从未被提示进入我的security credentials行列.

另一个奇怪的事情是,即使我改变返回falsein verify_password,我仍然得到相同的输出:Hello, !

sju*_*dǝʊ 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()
Run Code Online (Sandbox Code Playgroud)

但是,在处理它时,chrome 保存了 cookie,我不得不删除包括 cookie 在内的所有缓存,因为我正在自动进行身份验证。也许这会给你带来问题。

另外,不要忘记@app.route("/")用@auth.login_required装饰器标记。否则,不会调用 verify_password 回调。


小智 5

我经历过与OP相似的经历.如果您使用mod_wsgi运行,请确保WSGIPassAuthorization On按此处的说明进行设置.