2014-11-23 4 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 

Любая идея, почему это происходит? После некоторого googling мой первый инстинкт заключается в том, что, возможно, мне нужно сохранить или получить хэш-пароль в mongodb по-другому, так как кажется, что он хранится в виде строки. Есть идеи?

+0

Вы решили эту проблему? – aezell

ответ

0

Я считаю, что проблема заключается в том, что вы дважды храните пароль при создании объекта User в своем методе find_by_username. Этот метод захватывает информацию из БД, которая будет содержать хешированный пароль. Затем он создает объект User с этими данными. Объект User вызывает generate_password_hash в течение своего метода __init__. Таким образом, пароль дважды хэшируется и, следовательно, сбой проверки check_password_hash.

Возможно, вы захотите переместить хеширование пароля на функцию, которая вызывается, когда объект User сохраняется в БД. Вы хотите определить, был ли пароль изменен или нет, поэтому вы повторно не переписываете пароль. Есть и другие способы справиться с этим, но, короче говоря, вам может понадобиться переместить хэширование пароля из вызова __init__.

Смежные вопросы