2013-10-22 9 views
2

누군가 http-basic-auth를 단순화하기 위해이 flask extension을 사용했는지 궁금합니다.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 

여기서 주어진 암호를 해시하고 저장된 해시 암호와 비교할 수 없습니다. false 또는 true를 반환하는 sha256_crypt.verify(password, hashed_password_in_db) 메서드를 사용해야합니다.

이 방법이 있습니까? 아니면 내 자신의 솔루션을 롤업해야합니까? 감사합니다

+0

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

+0

링크를 제공해 주셔서 감사합니다. 프로젝트 홈페이지에는 링크가 누락되어 있습니다. 업데이트 된 질문을 살펴 보시기 바랍니다. 감사 – Houman

답변

1

나는 단지이 질문에 답이 남아 있다는 것을 깨달았습니다.

프로젝트는 md5 해시를 사용하려는 경우에 좋습니다.

그러나 제 경우와 마찬가지로 sha256_crypt을 사용하면 작동하는 방식으로이 확장명으로 작동하지 않게됩니다. (내 업데이트 된 질문을 참조하십시오)

나는 결국이 플라스크 제조 업체가 작성한 snippet을 사용하는 것입니다.

메소드 check_auth은 내가 부울을 반환하므로 정확히 필요합니다. 내 경우

나는 내가 플라스크-HTTPAuth의 개발자입니다 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

와 함께 작동하도록 다음과 같이 그것을 정의했습니다. 죄송합니다. 나는이 질문을 놓쳤습니다.

방금 ​​사용자 지정 기능을 사용하여 암호를 확인하는 방법을 제공하는 새 버전을 출시했습니다.get_passwordhash_password 콜백을 정의하는 대신 verify_password 콜백을 사용하여 비밀번호 확인을 완전히 끝낼 수 있습니다. 예를 들어 귀하의 경우이 콜백을 사용하십시오.

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

이 정보가 도움이되기를 바랍니다.