flask-httpauth: как декоратор get_password должен работать для basic-auth?

Интересно, кто-нибудь использовал это расширение фляги, чтобы упростить http-basic-auth.

По сути, я не понимаю этот пример:

users = {
    "john": "hello",
    "susan": "bye"
}

@auth.get_password
def get_pw(username):
    if username in users:
        return users[username]
    return None

get_password Кажется, что декоратор возвращает чистый пароль данного пользователя и, если он совпадает с тем, который предоставил пользователь, авторизация будет предоставлена.

Но никто не должен иметь доступ к понятным паролям пользователей. Я обычно отправляю ясный пароль и имя пользователя на сервер, хэширую пароль и сравниваю его с существующим хешированным паролем в базе данных.

Как это было предусмотрено?

ОБНОВИТЬ:

Ссылка на документы проливает больше света. поскольку для этого требуется второй декоратор:

@auth.hash_password
def hash_pw(username, password):
    get_salt(username)
    return hash(password, salt)

Буквально правило таково get_password(username) == hash_password(password)

То, как я понимаю это, чтобы работать get_password возвращает хешированный пароль пользователя в базе данных, который должен быть равен текущему хешированному паролю, определенному в hash_password метод.

Проблема, однако, я использую sha256_crypt из passlib.

def verify_password(password, hashed_password_in_db, password_hash_version):
    if password_hash_version == 1:
        return sha256_crypt.verify(password, hashed_password_in_db)
    return False 

Здесь вы не можете хешировать данный пароль и сравнить его с сохраненным хешированным паролем. Я должен использовать метод sha256_crypt.verify(password, hashed_password_in_db), который возвращает ложь или истину.

Есть ли способ достичь этого или мне нужно накатить собственное решение? Спасибо

2 ответа

Решение

Я просто понял, что эти вопросы остались без ответа.

Я уверен, что проект flask-httpauth отлично подходит для случаев, когда вы собираетесь использовать хэш md5.

Но, как и в моем случае, если вы используете sha256_crypt Вы не можете заставить это работать с этим расширением, из-за способа, которым это работает. (См. Мой обновленный вопрос)

В конечном итоге я использовал этот фрагмент, написанный создателем колбы.

Метод check_auth это именно то, что мне нужно, так как он возвращает логическое значение.

В моем случае я определил это так, чтобы заставить его работать с sha256_crypt

def check_auth(email, password):
    em_login_provider = ndb.Key('AuthProvider', get_provider_id(constants.EMAIL, email)).get()        
    if em_login_provider and em_login_provider.active:
        user = em_login_provider.user                
        if user and verify_password(password, user.password_hash, user.password_hash_version):
            return True
    return False

Я разработчик Flask-HTTPAuth. Извините, я пропустил этот вопрос.

Я только что выпустил новую версию, которая дает вам возможность использовать вашу пользовательскую функцию для проверки пароля. Вместо определения get_password а также hash_password обратные вызовы теперь вы можете использовать verify_password обратный вызов, который оставляет проверку пароля полностью на ваше усмотрение. Например, в вашем случае вы бы использовали этот обратный вызов:

@auth.verify_password
def verify_password(email, password):
    return check_auth(email, password)

Надеюсь, это поможет!

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