Экспортировать переменную из Javascript Promise - PullRequest
0 голосов
/ 24 января 2019

Справочная информация:

Привет всем, я работаю над функцией входа в 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;
}

1 Ответ

0 голосов
/ 24 января 2019

Модификация 1 не будет работать, потому что password будет установлен асинхронно, позже, после возврата do_login.

Модификация 2 не работает из-за опечатки; у вас есть

.then(h=> function(h){submitLogin(email,h.hashHex);return false;})

, но для этого используются и функция стрелки h => и function (h), в два раза больше функций, чем вы на самом деле хотите. Это должно работать лучше:

.then(h => { submitLogin(email, h.hashHex); })

(В следующей строке обработчик catch имеет ту же ошибку, поэтому измените оба.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...