Я использую passlib == 1.7.1 со следующим импортом:
from passlib.apps import custom_app_context as pwd_context
Затем хэшируем пароль со следующим:
pwd_context.encrypt(password)
Затем я проверяю с помощью:
pwd_context.verify(password, self.password_hash)
Это нормально, но с определенными символами проверка не выполняется.например, «£» или «$».
Кто-нибудь знает, почему это так, пожалуйста?
Спасибо!
Обновление:
Спасибо всем большое.Вооружившись этой информацией, я исследовал немного больше, и кажется, что проблема не в passlib, а где-то между angular4, где я отправляю заголовок авторизации base64 в приложение фляги.
В настоящее время я использую следующее, чтобы сделать это:
let headers: Headers = new Headers({
'Content-Type': 'application/json',
'Authorization': 'Basic ' + btoa(userLoginRequest.username + ':' + userLoginRequest.password)
});
Сегодня я много читал об unescape (и это обесценивает в пользу decodeURI ()).Я также много читал о поддержке юникода в кодировке base64.Я попробовал несколько комбинаций этих вещей, и это не имело никакого значения.Теперь я действительно очень запутался!
Чтобы проверить, что происходит, я делаю следующее.В angular4 я выполняю следующее:
let encodedString = btoa('doug:Tree£9')
console.log(encodedString)
console.log(atob(encodedString))
Как и ожидалось, на консоли выводится следующее.
ZG91ZzpUcmVlozk=
doug:Tree£9
Так что кодирование и декодирование совершенно нормально.
Выполнение того же процесса в Python ...
import base64
encoded = base64.b64encode('doug:Tree£9')
print encoded
print base64.b64decode(encoded)
В терминале я получаю следующее.
ZG91ZzpUcmVlwqM5
doug:Tree£9
Замечу, что "ZG91ZzpUcmVlozk =" и "ZG91ZzpUcmVlwqM5" не совпадают.Тем не менее, оба метода работают на своих собственных языках.
Если я помещаю кодированную строку "ZG91ZzpUcmVlozk =" из javascript в python и декодирую ее следующим образом ...
import base64
print base64.b64decode("ZG91ZzpUcmVlozk=")
Я получаю:
doug:Tree�9
Обратите внимание, что символ £ теперь разбит.
Другие символы Unicode тоже не работают.
Так что я думаю, что вопрос в том, как мне кодировать авторизациюзаголовок, чтобы python правильно распознал символ £, а какие-либо другие символы, которые пользователи выбирают для своих паролей?
Большое спасибо!
Редактировать: Решено!
Iнашел это Использование atob Javascript для декодирования base64 некорректно декодирует строки utf-8 , что связано с некоторыми подробностями.Я решил это, используя следующий подход, рекомендованный @ brandonscript.
b64EncodeUnicode(str) : string{
return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
return String.fromCharCode(parseInt(p1, 16))
}))
}
Работает отлично!Уф!