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

时间:2015-03-13 03:28:53

标签: python flask http-authentication flask-httpauth

当我尝试使用@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

另一个奇怪的事情是,即使我在false中更改了返回verify_password,我仍然会得到相同的输出:Hello, !

5 个答案:

答案 0 :(得分:5)

我经历过类似的OP。如果您使用mod_wsgi运行,请务必将WSGIPassAuthorization On设置为documented here

答案 1 :(得分:1)

我能够通过这个最小的例子获得用户名和密码:

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()

然而,在处理它时,chrome保存了cookie,我不得不删除所有缓存,包括cookie,因为我正在自动进行身份验证。也许这可能会给你带来麻烦。

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

答案 2 :(得分:1)

在EC2上运行Flask应用程序时遇到了同样的问题。所以我想你在wsgi服务后面运行你的应用程序。 关键是wsgi将截取每个请求标头用于不同目的,因此我们需要做一些配置以确保身份验证标头在到达我们的应用程序之前完好无损。 感谢Erik Stephens的回答,帮助我解决了这个问题。我将WSGIPassAuthorization On放到我的EC2实例上的/etc/httpd/conf.d/wsgi.conf并重新启动httpd服务。你们可能希望只为您的应用程序wsgi配置文件更新您的配置。 希望在启动应用程序到aws时帮助有相同问题的人。

答案 3 :(得分:0)

如果您允许用户,则@verify_password回调应返回True,如果您不允许,则返回False。在此函数中,匿名用户(即不发送身份验证的用户)使用usernamepassword字段的空字符串表示。

在您的代码中,您未验证用户凭据是否有效。相反,尝试这样的事情:

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

以上将允许用户名/密码的任意组合,但不允许匿名用户进入。

答案 4 :(得分:-1)

“”“基本身份验证示例此示例演示如何使用安全的哈希密码通过基本身份验证来保护Flask端点。运行此示例后,请在浏览器中访问http://localhost:5000。要获取访问权限,您可以使用(用户名= john,password = hello)或(用户名= susan,password = bye)。“”“从flask导入Flask从flask_httpauth导入,从werkzeug.HTTP导入HTTPBasicAuth。

app = Flask(name)auth = HTTPBasicAuth()

users = {“” john“:generate_password_hash(” hello“),” susan“:generate_password_hash(” bye“)}

@ auth.verify_password def verify_password(用户名,密码):如果用户名在用户中:返回check_password_hash(users.get(用户名),密码)返回False

@ app.route('/')@ auth.login_required def index():返回“你好,%s!” %auth.username()

如果name =='main':app.run(debug = True,host ='0.0.0.0')