2014-11-23 31 views
0

我正在構建燒瓶應用程序的用戶名/密碼驗證。當用戶註冊時,我將用戶名和密碼存儲在一個mongodb文檔中。無法在Flask中驗證散列密碼

這是我的用戶模型:

class User(): 

def __init__(self, userid=None,username=None,password=None): 
    self.userid= userid 
    self.username = username 
    self.password = generate_password_hash(password) 

def __repr__(self): 
    return '<User %r>' % self.username 

def is_authenticated(self): 
    return True 

def is_active(self): 
    return True 

def is_anonymous(self): 
    return False 

def get_id(self): 
    try: 
     return unicode(self.userid) 
    except NameError: 
     return unicode(self.userid) 

我使用WERKZEUG庫方法generate_password_hash和check_password_hash分別產生/檢查密碼。

這是我的用戶數據轉儲到MongoDB的代碼:

def db_dump(data): 
      k = {'username':data.username,'password':data.password} 
      db.users.insert(k,True) 

這是我通過用戶名獲取用戶數據代碼:

def find_by_username(username): 
     data = self.db.users.find_one({'username': username}) 
     user = User(userid=unicode(data['_id']),username=data['username'],password=data['password']) 
     return user 

這裏是我的問題。假設我有一個用戶'jon',其密碼爲'abcd'。當我運行的代碼來檢查密碼哈希爲新用戶直通控制檯,它工作正常:

>> check_password_hash(generate_password_hash('abcd'),'abcd') 
True 

然而,經過「喬恩已經簽署了與他的信息已經被傾倒到數據庫中,在隨後嘗試登錄時,我不得不從數據庫中檢索哈希密碼,檢查不工作:

>>check_password_hash(find_by_username('jon').password,'abcd') 
False 

任何想法,爲什麼發生這種情況?一些谷歌搜索後,我的第一本能是,也許我需要以不同的方式在mongodb中存儲或檢索哈希密碼,因爲它似乎被存儲爲一個字符串。有任何想法嗎?

+0

你解決了這個問題嗎? – aezell 2015-01-16 18:18:02

回答

0

我認爲問題在於,當您在find_by_username方法中實例化User對象時,您將雙重散列密碼。該方法從DB獲取包含哈希密碼的信息。然後,它會使用該數據創建一個User對象。 User對象在其__init__方法期間調用generate_password_hash。因此,密碼被雙重哈希,因此檢查失敗check_password_hash

您可能會考慮將密碼散列值移動到一個函數,該函數在將User對象保存到數據庫時調用。你會想要檢測密碼是否已經改變,所以你沒有反覆刷新密碼。還有其他方法可以處理這個問題,但總之,您可能需要將密碼散列在__init__之外。