1. ValueError : Invalid salt 에러
sign-up(회원가입) 후 로그인에서 비밀번호를 확인하는 과정에서 에러가 났다.
# sign-in 엔드포인드
# json으로 들어온 값 중 password를 해시해서 DB insert
new_user['password'] = bcrypt.hashpw(new_user['password'].encode('UTF-8'),
bcrypt.gensalt())
# 사용자 로그인 엔드포인트
password = credential['password'] # 입력으로 들어온 비밀번호 저장
bcrypt.checkpw(password.encode('UTF-8'),
user_credential['hashed_password'].encode('UTF-8'))
hashpw()는 인자로 string값이 아닌 byte 값을 받기 때문에 encode('UTF-8')을 추가하여 byte로 변환시킨다.
다음 예제 코드를 실행해보면 문자열 앞에 b를 달고 나온다.
import bcrypt
password = 'test1234'
hashed_password = bcrypt.hashpw(password.encode('UTF-8'),bcrypt.gensalt()).decode()
>>> b'$2b$12$DkNXQe7I.jpcHHSJ6L.2VO0HM9Lo0gOWYa0L6opgpTmqZfPKFMRYK'
이렇게 되면 처음 데이터베이스에 필드 설정을 문자열 (VARCHAR)로 했기 때문에 string 값이 아니라서 들어가지 않게된다.
그래서 다시 이 값을 decode 해줘야 한다.
끝에 decode() 만 추가해주면 된다. type 확인하면 str으로 잘 나온다.
import bcrypt
password = 'test1234'
hashed_password = bcrypt.hashpw(password.encode('UTF-8'),bcrypt.gensalt()).decode()
>>> $2b$12$76VoNMdv19vSKmygjf6QV.M.mykQ0vjAkaNYS.vQ06Aqjznvq4ZHi
<class 'str'>
checkpw 역쉬 마찬가지로 byte로 값을 받기 때문에 decode로 저장된 비밀번호를 다시 encode해서 byte로 변환해줘야 한다.
이제는 checkpw()를 해보면 True값을 반환한다.
import bcrypt
password = 'test1234'
hash_password = bcrypt.hashpw(password.encode('UTF-8'),bcrypt.gensalt()
).decode()
check_password = bcrypt.checkpw(password.encode('UTF-8'),
hash_password.encode('UTF-8'))
>>> $2b$12$KHXk7t3TvQWbSiY6lwpDo.PLt8W5q9gj1kePi7j535eaSpHZKLT7W
>>> True
- password.encode('UTF-8') : hashpw, checkpw의 인자로 넣을 때는 byte로 변환
- hash_password.encode('UTF-8') : 문자열로 변환시킨 비밀번호를 다시 byte로 변환
결론은 DB로 들어갈때 해시된 byte를 문자열로 바꿔줘야 한다. 맨 끝에 decode() 만 추가해주면 됨!
그런데 갑자기 decode 안해도 작동되는건 왤까..?
2. AttributeError: 'str' object has no attribute 'decode'에러
위의 에러를 해결하고 나니 token을 생성하는 코드 중 에러 발생
검색해보니 decode('UTF-8') 부분을 지워주면 된다고 한다.!! 이미 decode가 되어있단다.
파이썬 버전마다 뭔가 다른게 있나보다...
token = jwt.encode(payload, app.config['JWT_SECRET_KEY'],'HS256')
return jsonify({
'access_token' : token.decode('UTF-8')
})
참고
https://velog.io/@haileeyu21/ERROR-bcrypt-checkpw-ValueError-Invalid-salt
https://velog.io/@matisse/bcrypt
https://fusiondeveloper.tistory.com/31
'Python > Flask' 카테고리의 다른 글
[미니터] test - 미니터 unit test (0) | 2022.07.19 |
---|---|
[미니터] Test - 테스트 자동화 (0) | 2022.07.19 |
[미니터] 인증 - tweet, follow, unfollow에 decorator 추가 (0) | 2022.07.15 |
[미니터] 인증 - 인증 decorator 함수 (0) | 2022.07.15 |
[미니터] 인증 - sign-up, login (0) | 2022.07.14 |