Понимание того, как firebase обрабатывает вход с помощью JWT

# #node.js #firebase #firebase-authentication

Вопрос:

Я реализую аутентификацию JWT с использованием firebase в приложении ExpressJS, где JWT генерируется самой firebase

в login.html

 <form method="POST" class="register-form" id="login-form">
                        <div class="form-group">
                            <label><i class="zmdi zmdi-account material-icons-name"></i></label>
                            <input type="text" name="email" id="email" placeholder="Email" required/>
                        </div>
                        <div class="form-group">
                            <label><i class="zmdi zmdi-lock"></i></label>
                            <input type="password" name="password" id="password" placeholder="Password" required/>
                        </div>
                        <div class="form-group">
                            <input type="checkbox" name="remember-me" id="remember-me" class="agree-term" />
                            <label for="remember-me" class="label-agree-term"><span><span></span></span>Remember me</label>
                        </div>
                        <div class="form-group form-button">
                            <input type="submit" name="signin" id="signin" class="form-submit" value="Log in"/>
                        </div>

<script>
    // afterinitialzing firebase app
    document
          .getElementById("login-form")
          .addEventListener("submit", (event) => {
            event.preventDefault();
            const login = event.target.email.value;
            const password = event.target.password.value;

            const getToken = () => {
              console.log(login, password);
              return fetch(
                '/getToken', 
                { 
                  method: 'POST', 
                  headers: {
                    'Accept': 'application/json',
                    'Content-Type': 'application/json'
                  }, 
                  body: JSON.stringify({ 
                          email: login,
                          password: password 
                        }) 
                  }
              )
            }
            getToken();
</script>
 

в соответствии с firebase создайте пользовательский токен, я должен создать маршрут, на котором я проверю пароль пользователя и адрес электронной почты и получу uid и сгенерирую токен как

 app.post('/getToken', (req, res) => {
  const email = req.body.email
  const password = req.body.password

  admin
  .auth()
  .getUserByEmail(email)
  .then((userRecord) => {
    const uid = userRecord.uid;
    admin
    .auth()
    .createCustomToken(uid)
    .then((customToken) => {
      res.json({ token: customToken });
    })
    .catch((error) => {
      console.log('Error creating custom token:', error);
    });
  })
  .catch((error) => {
    console.log('Error fetching user data:', error);
  });

})
 

а затем завершите подписание таким образом

 const getToken = () => {
              console.log(login, password);
              return fetch(
                '/getToken', 
                { 
                  method: 'POST', 
                  headers: {
                    'Accept': 'application/json',
                    'Content-Type': 'application/json'
                  }, 
                  body: JSON.stringify({ 
                          email: login,
                          password: password 
                        }) 
                  }
              ).then((responseData) => {
                firebase.auth().signInWithCustomToken(token)
                .then((userCredential) => {
                  // Signed in
                  var user = userCredential.user;
                  // ...
                })
                .catch((error) => {
                  var errorCode = error.code;
                  var errorMessage = error.message;
                  // ...
                });

              })
            }
            getToken();
 

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

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

1. Используете ли вы только проверку подлинности Firebase или свою собственную базу данных для хранения учетных данных пользователя?

Ответ №1:

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

Хотя можно проверить введенные учетные данные на соответствие данным, хранящимся в проверке подлинности Firebase для этого пользователя, это довольно сложно, и нет смысла хранить учетные данные в проверке подлинности Firebase при чеканке пользовательских токенов. У меня такое чувство, что мы имеем дело с проблемой XY здесь.

Почему бы вам не использовать JavaScript SDK для аутентификации Firebase на стороне клиента? Это будет намного проще и идиоматично для данного сценария.

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

1. насколько я понял, я должен проверить учетные данные пользователя в моем случае, т. Е. адрес электронной почты и пароль в бэкэнде, а затем сгенерировать jwt и назначить. Если это так, то я не могу найти способ аутентификации пароля пользователя с помощью firebase admin SDK. Я могу проверить подлинность электронной почты, но не ввести пароль.

2. кроме того, я не использую js SDK на стороне клиента, поскольку это требование для обработки аутентификации и базы данных через серверную часть проекта

3. В этом сценарии нет смысла использовать встроенного поставщика электронной почты и паролей Firebase. Технически вы можете экспортировать хэши паролей из Firebase, использовать тот же алгоритм и соль для хэширования значения от пользователя и сравнить их. Но в этот момент, почему бы вам не сохранить учетные данные в своем собственном местоположении?