#node.js #heroku #firebase-authentication
#node.js #heroku #firebase-аутентификация
Вопрос:
Я создавал проект на node.js недавно я столкнулся с этой ошибкой аутентификации пользователя. Проблема в том, что после входа в систему с одной учетной записи, если одновременно я обновляю домашнюю страницу веб-сайта с другого устройства, она перенаправляется на панель управления первой учетной записи пользователя. Другими словами, один пользователь входит в систему на всех устройствах по сети. Если предположить, что я не обновляю страницу, и я нормально вхожу в приложение, оно работает нормально. Эта проблема возникает как на локальном хостинге, так и после его размещения на Heroku. Используемые технологии — node.js для обработки внутренних представлений и URL-адресов. HTML, CSS, JavaScript для интерфейса. Firebase для базы данных и аутентификации. Вот код для входа в систему-
const express = require("express");
const path = require("path");
//Create Router Object.
const router = express.Router();
//Main Login Page (GET)
router.get("/", (request, response) => {
response.sendFile(path.resolve("./views/html/login.html"));
});
//Main Login Page (POST)
router.post("/", (request, response) => {
let email = request.body.email;
let password = request.body.password;
firebase.auth().setPersistence(firebase.auth.Auth.Persistence.NONE);
firebase.auth().signInWithEmailAndPassword(email, password)
.then(r => {
let user = firebase.auth().currentUser;
if (user.emailVerified)
response.redirect('/dashboard');
else
response.send("<h1>Please Verify your email address.</h1>");
})
.catch(error => {
console.log(error);
response.send("<h1>Invalid Credentials</h1>");
});
});
Пожалуйста, кто-нибудь может мне помочь устранить эту ошибку в моем проекте?
Ответ №1:
Вызов firebase.auth().signInWithEmailAndPassword(email, password)
указывает пользователю местоположение, где бы вы ни вызывали этот код. Поскольку вы запускаете это в express.js приложение в Node.js , пользователь входит в систему, чтобы Node.js обрабатывайте их до тех пор, пока вы не выпишете их снова. Вот почему используемый вами Firebase Authentication SDK предназначен только для использования в клиентских приложениях, где это поведение работает должным образом.
При интеграции аутентификации Firebase в процесс на стороне сервера следует использовать Firebase Admin SDK. Этот Admin SDK не имеет понятия о текущем зарегистрированном пользователе и нет signInWithEmailAndPassword
. Вместо этого, если вам нужно знать личность пользователя, обращающегося к коду на стороне сервера, вы:
- Войдите в систему пользователя в своем клиентском приложении с помощью Firebase Authentication SDK.
- Получите идентификационный токен для этого пользователя на клиенте и передайте его вместе с вашим вызовом на сервер.
- На сервере проверьте этот идентификационный токен, чтобы убедиться, что пользователь является тем, за кого он себя выдает.
- Затем используйте информацию о личности пользователя, чтобы определить, авторизован ли он для доступа к информации.
Подробнее об этом см. Документацию Firebase по проверке токенов ID.