flask-httpauth:get_password装饰器如何用于basic-auth?

Hou*_*man 3 python flask flask-httpauth

我想知道是否有人使用这个烧瓶扩展来简化http-basic-auth.

基本上我不明白这个例子:

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

@auth.get_password
def get_pw(username):
    if username in users:
        return users[username]
    return None
Run Code Online (Sandbox Code Playgroud)

get_password装饰好像返回给用户的清除密码,如果它给用户提供了一个相匹配,则授权将被授予.

但是,没有人应该首先访问用户的明确密码.我通常会将明确的密码和用户名发送到后端,散列密码并将其与数据库中现有的哈希密码进行比较.

这是如何设想的?

更新:

与文档的链接更加轻松.因为有第二个装饰器需要实现这个:

@auth.hash_password
def hash_pw(username, password):
    get_salt(username)
    return hash(password, salt)
Run Code Online (Sandbox Code Playgroud)

字面上的规则是 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 
Run Code Online (Sandbox Code Playgroud)

在这里,您不能散列给定的密码并将其与存储的散列密码进行比较.我必须使用sha256_crypt.verify(password, hashed_password_in_db)返回false或true的方法.

有没有办法实现这一点,还是我必须推出自己的自定义解决方案?谢谢

Mig*_*uel 6

我是Flask-HTTPAuth的开发者.对不起我错过了这个问题.

我刚刚发布了一个新版本,它为您提供了一种使用自定义函数来验证密码的方法.您现在可以使用一个完全由您完成密码验证的回调,而不是定义get_passwordhash_password回调verify_password.例如,在您的情况下,您将使用此回调:

@auth.verify_password
def verify_password(email, password):
    return check_auth(email, password)
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助!


Hou*_*man 1

我刚刚意识到这个问题仍然没有答案。

我确信该项目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
Run Code Online (Sandbox Code Playgroud)