2014-11-23 2 views
0

플라스크 응용 프로그램의 사용자 이름/암호 인증을 구축 중입니다. 사용자가 등록 할 때 사용자 이름과 암호를 mongodb 문서에 저장합니다.플라스크의 해시 된 암호를 인증 할 수 없습니다.

이 내 사용자 모델이다 : 나는 각각의 암호를 확인/생성 generate_password_hash 및 check_password_hash WERKZEUG 라이브러리 방법을 사용하고

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) 

.

이는 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 

여기 내 문제입니다. 암호가 'abcd'인 사용자 'jon'이 있다고 가정 해 보겠습니다. '존'은 가입 후, 그러나

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

을 그의 정보는에, 데이터베이스에 덤프되었습니다 내가 콘솔을 통해 새 사용자의 암호 해시를 확인하는 코드를 실행하면, 그것을 잘 작동합니다 데이터베이스에서 해시 된 암호를 검색해야하는 후속 로그인 시도는 검사가 작동하지 않습니다.

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

이 문제가 발생하는 이유는 무엇입니까? 내 첫 번째 본능을 검색 한 후 문자열을 저장하는 것처럼 보이기 때문에 다른 방법으로 mongodb에 해시 암호를 저장하거나 검색해야 할 수도 있습니다. 어떤 아이디어?

+0

이 문제를 해결 했습니까? – aezell

답변

0

find_by_username 메서드에서 User 개체를 인스턴스화 할 때 암호를 두 번 해시하는 것이 문제라고 생각합니다. 이 방법은 해시 된 암호를 포함 할 DB에서 정보를 가져옵니다. 그런 다음 해당 데이터가있는 User 개체를 만듭니다. User 개체는 __init__ 메서드 중에 generate_password_hash 메서드를 호출합니다. 따라서 암호는 이중 해시이므로 check_password_hash 검사에 실패합니다.

암호 해시를 User 개체가 DB에 저장 될 때 호출되는 함수로 이동하는 것이 좋습니다. 암호가 변경되었는지 여부를 감지하여 반복적으로 암호를 다시 해싱하지 않으려 고합니다. 간단히 말해서 __init__ 호출에서 암호 해시를 이동하려는 경우가 있습니다.

관련 문제