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)
Надеюсь, это поможет!