Функция 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')

Другие вопросы по тегам