Страница оформления заказа завершает работу пользователя

#javascript #firebase #firebase-authentication

#javascript #firebase #firebase-аутентификация

Вопрос:

Единственный способ проверить, вошел ли пользователь в мое веб-приложение, — это использовать следующее во внешнем интерфейсе

 firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
  } else {
    // No user is signed in.
  }
});
  

Однако у меня есть облачная функция, которую я использую для обработки платежа, она выглядит следующим образом

 app.post("/payment", function (req, res) {
  const orderId = new Date().getTime();
  mollieClient.payments
    .create({
      amount: {
        value: req.body.amount.amount,
        currency: req.body.amount.currency,
      },
      description: req.body.description,
      //redirectUrl: `http://localhost:5500/project/order.html?id=${orderId}`,
      redirectUrl: `https://......web.app/order.html?id=${orderId}`, 
      webhookUrl: .....
    })
    .then((payment) => {
      res.send({
        redirectUrl: payment.getCheckoutUrl(),
      });
      return payment.getCheckoutUrl();
    })
  

Моя проблема связана с URL-адресом перенаправления, страница перенаправления на заказ должна отображать информацию об этом заказе, но она ничего не отображает, потому что я установил, что ее могут видеть только зарегистрированные пользователи. Мой вопрос в том, почему он выходит из системы пользователя. Я попытался перенаправить как на ‘localhost’, так и на ‘URL-of-deployed-firebase-app’, и в обоих случаях он выводит пользователя из системы. Я интуитивно подумал, что Firebase хранит информацию аутентификации в локальном хранилище, потому что я могу перейти на любую страницу, которую я хочу, без необходимости входа в систему. Но я думаю, что здесь это не так. Я не использую никаких let token = result.credential.accessToken токенов для отслеживания статуса авторизации. В чем здесь проблема и как мне поступить?

Вот страница заказа

 function getOrderDetails() {
  const url = new URL(window.location.href);
  let orderId = url.searchParams.get("id");
  firebase.auth().onAuthStateChanged(function (user) {
    if (user) {
      console.log("User logged in "   user);
      firebase
      .firestore()
      .doc(`orders/${orderId}`)
      .get()
      .then((doc) => {
        let orderSelected = {
          category: doc.data().category,
          delivery: doc.data().delivery,
          description: doc.data().description,
          price: doc.data().price,
          title: doc.data().title,
          quantity: doc.data().quantity,
        };
     // set textContent of divs
     } else {
       console.log("User not logged in "   user);
     }
  });
}

getOrderDetails();
  

Комментарии:

1. Аутентификация Firebase по умолчанию сохранит учетные данные пользователя для аутентификации в локальном хранилище и восстановит их на новой странице. Можете ли вы показать код для вашей новой страницы и как он использует текущего пользователя?

2. @FrankvanPuffelen мой код перенаправления большой, но все начинается с вызова firebase.auth().onAuthStateChanged() , if (user) затем извлекает данные из Firestore и отображает информацию, но там else выполняется, и ничего не отображается.

3. Если только console.log("User not logged in " user); распечатки, а другой журнал никогда не печатается, Firebase не может восстановить состояние аутентификации пользователя. Как вы регистрируете пользователя и на какой платформе вы запускаете этот код?

Ответ №1:

На новой странице требуется время для восстановления учетных данных пользователя, поскольку для этого может потребоваться вызов сервера. Поэтому нормально, что ваш onAuthStateChanged() слушатель сначала вызывается с null помощью и только после этого с фактическим пользователем. Таким образом, вам придется обрабатывать поток таким образом, чтобы иметь дело с начальным null , например, подождав несколько секунд, прежде чем предположить, что сеанс пользователя не восстановлен.

Кроме того, вы можете самостоятельно сохранить значение маркера в локальном хранилище, чтобы указать, что недавно был выполнен вход, а затем на следующей странице использовать это, чтобы предположить, что восстановление будет успешным.

Комментарии:

1. Я не совсем понял альтернативное решение для этого, что вы подразумеваете под marker value и restore это на следующей странице?

2. Что касается первого предложения, я использовал setTimeout() для ожидания несколько секунд, чтобы пользователь был восстановлен правильно, но без какого-либо успеха. Не могли бы вы уточнить ответ, пожалуйста?

3. Давайте сосредоточимся на первом решении, а не на альтернативе. Можете ли вы показать своему onAuthStateChanged слушателю, что, например, регистрирует состояние, которое он получает, и setTimeout то, что вы делаете?

4. Я обновил вопрос, я просто попытался вызвать getOrderDetails() дважды и интервал в несколько секунд между ними, но оба раза он отображается null для пользователя.

5. Вы не должны вызывать firebase.auth().onAuthStateChanged(function (user) { несколько раз. Достаточно вызвать его один раз, чтобы подключить слушателя, который затем будет вызываться обратно при каждом изменении состояния аутентификации. Если вы вызываете его только один раз, вы должны получить два вывода журнала. В первый раз это должно быть вашим console.log("User not logged in " user); , во второй раз это должно быть вашим console.log("User logged in " user); . Если этого не происходит, обновите свой вопрос, чтобы включить выходные данные, которые вы получаете.