Справочная информация:
Привет всем, я работаю над функцией входа в AJAX для веб-сайта и пытаюсь использовать Argon2 KDF ( библиотека )) получить (несколько) ресурсоемкий секрет в самом браузере из предоставленного пользователем пароля перед его отправкой на сервер для проверки.Сайт использует TLS, так что я думаю, что с точки зрения безопасности это своего рода спорный вопрос, но я бы предпочел, чтобы клиент выполнял эту часть работы, а не сервер, и в любом случае это скорее опыт обучения, чем рабочий сайт..
Вопрос:
Пример кода правильно вычисляет хэш в моем проекте, что подтверждается выводом console.log(h.hashHex)
, но я пробовал десятки способовпопробуйте присвоить значение переменной для последующего использования в той же функции.Я понимаю, что Promise является асинхронным, поэтому я уверен, что где-то не так в отношении потоковПри отладке переменная, которая должна быть шестнадцатеричной строкой, либо остается неопределенной, либо оптимизируется без .Я уверен, что есть кое-что простое, что я пропускаю, но, глядя на похожие вопросы ( 1 , 2 , 3 ), я все еще не могу ответить на негоработать и не иметь большого опыта в JavaScript.Спасибо за ваш вклад!
Пример кода (Работает)
argon2.hash({ pass: $("#password").val(), salt: 'somesalt' })
.then(h => console.log(h.hash, h.hashHex, h.encoded))
.catch(e => console.error(e.message, e.code));
Модификация 1 (Не работает):
function do_login() {
...
var password;
argon2.hash({ pass: $("#password").val(), salt: 'somesalt' })
.then(h => {password=h.hashHex})
.catch(e => console.error(e.message, e.code));
...
}
Модификация 2 (также не работает):
function submitLogin(email, pass) {
...
$.ajax
({
type:'post',
url:'/login',
data:{
do_login:"do_login",
email:email,
password:pass
},
success:function(response) {
...
}
});
}
function do_login()
{
var email=$("#username").val();
var password = $("#password").val();
argon2.hash({ pass: password, salt: 'somesalt' })
.then(h=> function(h){submitLogin(email,h.hashHex);return false;})
.catch(e => function(e){console.error(e.message, e.code);return false;});
}
Обновление (ответ ниже)
function submitLogin(email, pass) {
...
$.ajax
({
type:'post',
url:'/login',
data:{
do_login:"do_login",
email:email,
password:pass
},
success:function(response) {
...
}
});
}
function do_login()
{
var email=$("#username").val();
var password = $("#password").val();
argon2.hash({ pass: password, salt: 'somesalt' })
.then(h=>submitLogin(email,h.hashHex))
.catch(e => console.error(e.message, e.code));
return false;
}