Flask-HTTPAuth verify_password 函数未收到用户名或密码
Flask-HTTPAuth verify_password function not receiving username or password
当我尝试使用 @auth.login_required
装饰器访问路由时,系统提示我 window 输入我的用户名和密码。输入此信息后,verify_password
函数的参数 username_or_token
和 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
header.
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
。
另一个奇怪的是,即使我在verify_password
中将return更改为false
,我仍然得到相同的输出:Hello, !
我可以通过这个最小的例子获得用户名和密码:
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 在内的所有缓存,因为我正在自动进行身份验证。也许这会给您带来麻烦。
此外,不要忘记用 @auth.login_required
装饰器标记 @app.route("/")
。否则,verify_password 回调不会被调用。
如果您允许用户,@verify_password
回调应该 return True
,如果不允许,则 False
。在此函数中,匿名用户(即不发送身份验证的用户)在 username
和 password
字段中都用空字符串表示。
在您的代码中,您没有验证用户凭据是否有效。相反,尝试这样的事情:
@auth.verify_password
def verify_password(username, password):
logger.debug("username = %s" % username)
logger.debug("password = %s" % password)
if username == '':
return False
return true
以上将允许任意组合username/password,但不会让匿名用户进入。
我的经历和OP差不多。如果您是 运行 mod_wsgi,请务必将 WSGIPassAuthorization On
设置为 documented here。
我在 EC2 上 运行 我的 Flask 应用程序时遇到了同样的问题。所以我猜你 运行 你的应用程序支持 wsgi 服务。
关键是 wsgi 会拦截每个请求 header 用于不同的目的,所以我们需要做一些配置以确保身份验证 header 在到达我们的应用程序之前是完整的。
感谢 Erik Stephens 的回答帮助我解决了这个问题。我在我的 EC2 实例上将 WSGIPassAuthorization On 设置为 /etc/httpd/conf.d/wsgi.conf 并重新启动 httpd 服务。你们可能希望只针对您的应用程序 wsgi 配置文件更新您的配置。
希望这对在将应用程序启动到 aws 时遇到同样问题的人有所帮助。
基本身份验证示例。此示例演示如何使用安全散列密码通过基本身份验证保护 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')
当我尝试使用 @auth.login_required
装饰器访问路由时,系统提示我 window 输入我的用户名和密码。输入此信息后,verify_password
函数的参数 username_or_token
和 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
header.
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
。
另一个奇怪的是,即使我在verify_password
中将return更改为false
,我仍然得到相同的输出:Hello, !
我可以通过这个最小的例子获得用户名和密码:
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 在内的所有缓存,因为我正在自动进行身份验证。也许这会给您带来麻烦。
此外,不要忘记用 @auth.login_required
装饰器标记 @app.route("/")
。否则,verify_password 回调不会被调用。
如果您允许用户,@verify_password
回调应该 return True
,如果不允许,则 False
。在此函数中,匿名用户(即不发送身份验证的用户)在 username
和 password
字段中都用空字符串表示。
在您的代码中,您没有验证用户凭据是否有效。相反,尝试这样的事情:
@auth.verify_password
def verify_password(username, password):
logger.debug("username = %s" % username)
logger.debug("password = %s" % password)
if username == '':
return False
return true
以上将允许任意组合username/password,但不会让匿名用户进入。
我的经历和OP差不多。如果您是 运行 mod_wsgi,请务必将 WSGIPassAuthorization On
设置为 documented here。
我在 EC2 上 运行 我的 Flask 应用程序时遇到了同样的问题。所以我猜你 运行 你的应用程序支持 wsgi 服务。 关键是 wsgi 会拦截每个请求 header 用于不同的目的,所以我们需要做一些配置以确保身份验证 header 在到达我们的应用程序之前是完整的。 感谢 Erik Stephens 的回答帮助我解决了这个问题。我在我的 EC2 实例上将 WSGIPassAuthorization On 设置为 /etc/httpd/conf.d/wsgi.conf 并重新启动 httpd 服务。你们可能希望只针对您的应用程序 wsgi 配置文件更新您的配置。 希望这对在将应用程序启动到 aws 时遇到同样问题的人有所帮助。
基本身份验证示例。此示例演示如何使用安全散列密码通过基本身份验证保护 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')