Ошибка типа: хэш должен быть в юникоде или байтах, а не встроенный_функция_или_метод
Я пытаюсь реализовать авторизацию JWT для приложения Flask. Однако, когда я пытаюсь войти, он возвращает "500 Internal server error"
с "TypeError: хэш должен быть в юникоде или байтах, а не встроенный_функция_или_метод". Что я мог упустить здесь.
Вот мой класс от models.py
from passlib.hash import pbkdf2_sha256
# Create classes to store data.
class User:
""" This class provides a way to store user data. """
users = [
{
'id': 1,
'username': u'mwinel',
'email': u'mwinel@example.com',
'password': u'code618'
},
{
'id': 2,
'username': u'lucy',
'email': u'lucy@example.com',
'password': u'123456'
}
]
def __init__(self, id, username, email, password):
""" Initialize objects. """
self.id = user_id,
self.username = username,
self.email = email,
self.password = password
@staticmethod
# Generate a hashed string to be
# stored by our class model.
def generate_hash(password):
hash = pbkdf2_sha256.encrypt(password, rounds = 20000, salt_size = 16)
return hash
@staticmethod
# Check a given password.
def verify_hash(password, hash):
return pbkdf2_sha256.verify(password, hash)
И вот мой метод входа
from flask_restful import Resource, reqparse
from app.models import User
class UserLogin(Resource):
# Call the method to login a user.
def post(self):
parser = reqparse.RequestParser()
parser.add_argument('username', required = True)
parser.add_argument('password', required = True)
data = parser.parse_args()
username = data['username']
password = data['password']
for user in User.users:
if password == User.verify_hash(data['password'], hash):
return {
'message': 'Logged in as {}'.format(data['username']),
}, 200
return {
'message': 'Something went wrong'
}, 500
А вот и ошибка
TypeError: hash must be unicode or bytes, not builtin_function_or_method
2 ответа
Вам нужно изменить
if password == User.verify_hash(data['password'], hash):
за
if password == User.verify_hash(data['password'], user['hash']):
но вы не храните те хеши, которые делают все ваше шифрование бесполезным.
Вместо этого используйте функцию хеширования для хранения хэшей паролей в массиве пользователей следующим образом:
# Create classes to store data.
class User:
""" This class provides a way to store user data. """
users = [
{
'id': 1,
'username': u'mwinel',
'email': u'mwinel@example.com',
'hash': u'$pbkdf2-sha256$20000$OCeEcM55zzlnbG3tfW9tTQ$k3dRDawLaOMlR4cehJEP/2b0JUTMrtPedzLYxNQWICM'
},
{
'id': 2,
'username': u'lucy',
'email': u'lucy@example.com',
'password': u'$pbkdf2-sha256$20000$8D6H0Npbaw3BWGsNYSxFyA$FxkRkBXuQy8VFRX8dSdygzQ4vNlvFJl6hWZQ6LT2NIc'
}
]
Когда эта строка достигнута, вы еще не определили хеш:
if password == User.verify_hash(data['password'], hash):
Я считаю, что это обычно вызывает NameError, однако есть встроенная функция python, называемая hash, которую вместо этого пытаются передать в ваш метод verify_hash ( https://docs.python.org/3.5/library/functions.html). Это то, что заставляет вашу программу взорваться с этим исключением.