# #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, использовать тот же алгоритм и соль для хэширования значения от пользователя и сравнить их. Но в этот момент, почему бы вам не сохранить учетные данные в своем собственном местоположении?