2013-10-22 29 views
2

我想知道是否有人用这个flask extension来简化http-basic-auth。flask-httpauth:get_password装饰器是如何为basic-auth工作的?

基本上我不明白这个example

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

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

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

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

这是如何设想的?

UPDATE:

的链接文档揭示了一些更多的光。因为实现这一目标有需要第二装饰:

@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 from 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),它返回false或true。

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

+0

https://github.com/miguelgrinberg/Flask-HTTPAuth/blob/master/docs/index.rst – CBroe

+0

感谢您的链接,因为它似乎在项目中失踪。请你看看最新的问题?谢谢 – Houman

回答

1

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

我相信该项目flask-httpauth是伟大的情况下,你打算使用MD5散列。

但是和我一样,如果你使用sha256_crypt你不能使它适用于这个扩展,因为它的工作方式。 (看我更新的问题)

我最终做的是用烧瓶制造商写的这个snippet

方法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 
4

我烧瓶HTTPAuth的开发工作。抱歉,我错过了这个问题。

我刚刚发布了一个新版本,可以让您使用自定义函数验证密码。现在不用定义get_passwordhash_password回调,您现在可以使用verify_password回调,该回调使密码验证完全由您决定。例如,在你的情况下,你会使用这个回调:

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

我希望这有助于!