问题描述
我在Flutter项目中使用Prestashop Web服务,我可以获取和发布数据并注册客户,但是登录时遇到了问题。 Prestashop中的登录名需要对密码进行哈希处理以进行验证。 我尝试了很多像crypto package这样的散列包,但是没有任何效果。 这是我的代码。
Future<List<Info>> getUserInfo(String email) async {
var url =
'https://www.example.com/api/customers?filter[email]=$email&display=[id,lastname,firstname,passwd]';
List<Info> data = new List();
Response response;
response = await get(url,headers: <String,String>{
'authorization': getAuth(),});
if (response.statusCode == 200) {
if (response.body.length != 0) {
var raw = XmlDocument.parse(response.body);
var elements = raw.findAllElements("customer");
data.addAll(elements.map((element) {
return Info(
customerID: removeAllHtmlTags(
element.findElements('id').single.text.toString()),firstName: removeAllHtmlTags(
element.findElements('lastname').single.text.toString()),lastName: removeAllHtmlTags(
element.findElements('firstname').single.text.toString()),password: removeAllHtmlTags(
element.findElements('passwd').single.text.toString()),);
}).toList());
} else {
data = null;
}
}
return data;}
////验证登录名
Future<String> VerifyLogin({String password,String email}) async {
String result = '';
List<Info> data = await getUserInfo(email);
const cookie_key = '$cookie_key';
final cryptPass = crypto.md5
.convert(utf8.encode(cookie_key + password))
.toString()
.toLowerCase();
if (data != null) {
print(cryptPass);
print(data.first.password);
if (data.first.password == cryptPass) {
final SharedPreferences prefs = await _prefs;
prefs.setString('id',data.first.customerID);
result = 'success';
} else {
result = 'wrong password';
}
} else {
result = 'wrong email';
}
return result;}
解决方法
在Prestashop 1.7中,使用了bcrypt。
请参见this答案,它完美地说明了Prestashop如何处理密码加密/散列。