Функция Flask-HTTPAuth verify_password не получает имя пользователя или пароль
Когда я пытаюсь получить доступ к маршруту с @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
ОБНОВИТЬ
Я упростил код до этого:
@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, !
4 ответа
Я испытал подобное на ОП. Если вы работаете с mod_wsgi, обязательно установите WSGIPassAuthorization On
как задокументировано здесь.
Мне удалось получить имя пользователя и пароль с помощью этого минимального примера:
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 сохранял куки, и мне пришлось удалить весь кеш, включая куки, потому что я получал автоматическую аутентификацию. Может быть, это может вызвать у вас проблемы.
Также не забудьте отметить @app.route("/")
с @auth.login_required
декоратор. В противном случае обратный вызов verify_password не вызывается.
У меня та же проблема при запуске моего приложения Flask на EC2. Я полагаю, вы работаете с приложением через службу wsgi. Суть в том, что wsgi будет перехватывать каждый заголовок запроса для разных целей, поэтому нам нужно выполнить некоторые настройки, чтобы убедиться, что заголовок аутентификации не будет поврежден, пока не достигнет нашего приложения. Спасибо за ответ от Эрика Стивенса, который помог мне решить эту проблему. Я включил WSGIPassAuthorization в /etc/httpd/conf.d/wsgi.conf в своем экземпляре EC2 и перезапустил службу httpd. Вы, ребята, можете хотеть иметь это обновление только для вашего файла конфигурации wsgi вашего приложения до вашей конфигурации. Надеюсь, что это поможет кому-то с такой же проблемой при запуске приложения на AWS.
@verify_password
обратный вызов должен вернуться 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
Вышеуказанное разрешит любую комбинацию имени пользователя / пароля, но не позволит анонимным пользователям войти.
"""Пример обычной проверки подлинности В этом примере показано, как защитить конечные точки Flask с помощью обычной проверки подлинности с использованием безопасных хешированных паролей. После запуска этого примера перейдите на страницу http://localhost:5000/ в своем браузере. Чтобы получить доступ, вы можете использовать (username=john, password=hello) или (username=susan, password=bye). """из колбы импортировать колбу из flask_httpauth импортировать HTTPBasicAuth из werkzeug.security импортировать generate_password_hash, check_password_hash
app = Flask (имя) 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 ()
if name == 'main': app.run (debug = True, host = '0.0.0.0')