8

当我尝试使用@auth.login_required装饰器访问路由时,系统会提示我输入用户名和密码。输入此信息后,函数的参数username_or_tokenpassword为。为什么数据是空的?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

更新

我已将代码简化为:

@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的。

另一个奇怪的是,即使我将 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()

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

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

于 2015-03-13T09:10:18.817 回答
1

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

于 2017-03-19T16:39:14.360 回答
0

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

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

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

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

于 2015-03-21T21:06:31.040 回答
0

基本身份验证示例。此示例演示如何使用安全散列密码通过基本身份验证保护 Flask 端点。运行此示例后,http://localhost:5000在浏览器中访问。要获得访问权限,您可以使用 (username=john, password=hello) 或 (username=susan, password=bye)。

from flask import Flask 
from flask_httpauth import HTTPBasicAuth 
from werkzeug.security import generate_password_hash, check_password_hash

app = Flask(name) 
auth = HTTPBasicAuth()

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

@auth.verify_password 
def verify_password(username, password): 
    if username in users: return check_password_hash(users.get(username), password) 
    else: return False

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

if name == 'main': 
    app.run(debug=True, host='0.0.0.0')
于 2019-04-03T14:11:35.303 回答