我想知道是否有人使用这个烧瓶扩展来简化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
方法中定义的当前哈希密码。
问题是,我正在使用 passlib 中的sha256_crypt。
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)
,它返回 false 或 true。
有没有办法实现这一点,或者我必须推出自己的自定义解决方案?谢谢
我是Flask-HTTPAuth的开发者。对不起,我错过了这个问题。
我刚刚发布了一个新版本,它为您提供了一种使用自定义函数来验证密码的方法。您现在可以使用verify_password
回调,而不是定义get_password
和hash_password
回调,该回调完全由您进行密码验证。例如,在您的情况下,您将使用此回调:
@auth.verify_password
def verify_password(email, password):
return check_auth(email, password)
我希望这有帮助!
我刚刚意识到这个问题仍然没有答案。
我相信该项目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