Firebase如何获取当前用户
Firebase how to get the current user
我使用express js和firebase进行用户授权。注册后,用户进入个人资料。
如何在个人资料页面上获取当前帐户并获取其数据?这样即使在更新页面后,您也不会丢失当前用户?
我读过有关 onAuthStateChanged 的信息,但我不明白如何在我的代码中使用它。 (我想在我的 profile.write js 中,但我不明白怎么做)。或者从 cookies 中获取一个 token 并接收它?我可以举个例子吗?
server.js
const cookieParser = require("cookie-parser");
const csrf = require("csurf");
const bodyParser = require("body-parser");
const express = require("express");
const path = require('path');
const admin = require("firebase-admin"); // firebase администрирование
const serviceAccount = require("./public/serviceAccountKey.json"); // загружаем файл ключа
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://paradox-website-cd25b.firebaseapp.com",
});
const csrfMiddleware = csrf({ cookie: true });
let initial_path = path.join(__dirname, "public"); // директория работы
const app = express();
app.engine("html", require("ejs").renderFile);
app.use(express.static(initial_path)); // инициализация рабочей директории
app.use(bodyParser.json());
app.use(cookieParser());
app.use(csrfMiddleware);
app.all("*", (req, res, next) => {
res.cookie("XSRF-TOKEN", req.csrfToken());
next();
});
app.get('/login', (req, res) => {
res.sendFile(path.join(initial_path, "login.html"));
})
app.get('/register', (req, res) => {
res.sendFile(path.join(initial_path, "register.html"));
})
app.get('/signup', (req, res) => {
res.sendFile(path.join(initial_path, "signup.html"));
})
app.get("/profile", function (req, res) {
const sessionCookie = req.cookies.session || "";
admin
.auth()
.verifySessionCookie(sessionCookie, true /** checkRevoked */)
.then((userData) => {
console.log("Logged in:", userData.email)
res.sendFile(path.join(initial_path, "profile.html"));
})
.catch((error) => {
res.redirect("/login");
});
});
app.get('/', (req, res) => {
res.sendFile(path.join(initial_path, "index.html"));
})
app.post("/sessionLogin", (req, res) => {
const idToken = req.body.idToken.toString();
const expiresIn = 60 * 60 * 24 * 5 * 1000; // вычисляем, сколько файл куки будет храниться (5 дней в миллисикундах)
admin
.auth()
.createSessionCookie(idToken, { expiresIn }) // создаем файл куки со сроком хранения
.then(
(sessionCookie) => {
const options = { maxAge: expiresIn, httpOnly: true }; // параметры (http only)
res.cookie("session", sessionCookie, options); // файл с парамертрами
res.end(JSON.stringify({ status: "success" }));
},
(error) => {
res.status(401).send("UNAUTHORIZED REQUEST!");
}
);
});
app.post("/sessionRegister", (req, res) => {
const idToken = req.body.idToken.toString();
const expiresIn = 60 * 60 * 24 * 5 * 1000; // вычисляем, сколько файл куки будет храниться (5 дней в миллисикундах)
admin
.auth()
.createSessionCookie(idToken, { expiresIn }) // создаем файл куки со сроком хранения
.then(
(sessionCookie) => {
const options = { maxAge: expiresIn, httpOnly: true }; // параметры (http only)
res.cookie("session", sessionCookie, options); // файл с парамертрами
res.end(JSON.stringify({ status: "success" }));
},
(error) => {
res.status(401).send("UNAUTHORIZED REQUEST!");
}
);
});
app.get("/sessionLogout", (req, res) => {
res.clearCookie("session");
res.redirect("/login");
});
app.listen("3000", () => {
console.log('listening......');
})
public/js/firebase.js
// Import the functions you need from the SDKs you need
import { initializeApp } from "https://www.gstatic.com/firebasejs/9.6.10/firebase-app.js";
import { getAnalytics } from "https://www.gstatic.com/firebasejs/9.6.10/firebase-analytics.js";
import { getFirestore } from "https://www.gstatic.com/firebasejs/9.6.10/firebase-firestore.js";
import { getAuth, setPersistence, signInWithRedirect, inMemoryPersistence } from "https://www.gstatic.com/firebasejs/9.6.10/firebase-auth.js";
// TODO: Add SDKs for Firebase products that you want to use
// https://firebase.google.com/docs/web/setup#available-libraries
// Your web app's Firebase configuration
// For Firebase JS SDK v7.20.0 and later, measurementId is optional
let firebaseConfig = {
// this my config
};
// Initialize Firebase
const app = initializeApp(firebaseConfig);
const analytics = getAnalytics(app);
export let db = getFirestore(app);
// Авторизация
const auth = getAuth();
setPersistence(auth, inMemoryPersistence)
public/js/register.js
import { getAuth, createUserWithEmailAndPassword, signOut, onAuthStateChanged } from "https://www.gstatic.com/firebasejs/9.6.10/firebase-auth.js";
let auth = getAuth();
window.addEventListener("DOMContentLoaded", () => {
document
.getElementById("register")
.addEventListener("submit", (event) => {
event.preventDefault();
const email = event.target.login.value;
const password = event.target.password.value;
console.log('Login: ' + email + ' Password: ' + password);
createUserWithEmailAndPassword(auth, email, password)
.then(({ user }) => {
return user.getIdToken().then((idToken) => {
return fetch("/sessionRegister", {
method: "POST",
headers: {
Accept: "application/json",
"Content-Type": "application/json",
"CSRF-Token": Cookies.get("XSRF-TOKEN"),
},
body: JSON.stringify({ idToken }),
});
});
})
.then(() => {
signOut(auth).then(() => {
window.location.assign("/profile");
}).catch((error) => {
console.log("Не удалось завершить сессию. Ошибка:" + error);
});
});
return false;
});
});
onAuthStateChanged(auth, user => {
if (user) {
console.log('Logged in as ${user.email}' );
} else {
console.log('No user');
}
});
Firebase 在用户登录时自动保留当前用户的凭据,并在 page/app 重新加载时尝试恢复这些凭据。要检测恢复何时完成或其他状态更改,您需要使用 so-called onAuthStateChanged
侦听器,如 getting the currently signed-in user 上的文档所示。从那里:
import { getAuth, onAuthStateChanged } from "firebase/auth";
const auth = getAuth();
onAuthStateChanged(auth, (user) => {
if (user) {
// User is signed in, see docs for a list of available properties
// https://firebase.google.com/docs/reference/js/firebase.User
const uid = user.uid;
// ...
} else {
// User is signed out
// ...
}
});
我使用express js和firebase进行用户授权。注册后,用户进入个人资料。
如何在个人资料页面上获取当前帐户并获取其数据?这样即使在更新页面后,您也不会丢失当前用户?
我读过有关 onAuthStateChanged 的信息,但我不明白如何在我的代码中使用它。 (我想在我的 profile.write js 中,但我不明白怎么做)。或者从 cookies 中获取一个 token 并接收它?我可以举个例子吗?
server.js
const cookieParser = require("cookie-parser");
const csrf = require("csurf");
const bodyParser = require("body-parser");
const express = require("express");
const path = require('path');
const admin = require("firebase-admin"); // firebase администрирование
const serviceAccount = require("./public/serviceAccountKey.json"); // загружаем файл ключа
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://paradox-website-cd25b.firebaseapp.com",
});
const csrfMiddleware = csrf({ cookie: true });
let initial_path = path.join(__dirname, "public"); // директория работы
const app = express();
app.engine("html", require("ejs").renderFile);
app.use(express.static(initial_path)); // инициализация рабочей директории
app.use(bodyParser.json());
app.use(cookieParser());
app.use(csrfMiddleware);
app.all("*", (req, res, next) => {
res.cookie("XSRF-TOKEN", req.csrfToken());
next();
});
app.get('/login', (req, res) => {
res.sendFile(path.join(initial_path, "login.html"));
})
app.get('/register', (req, res) => {
res.sendFile(path.join(initial_path, "register.html"));
})
app.get('/signup', (req, res) => {
res.sendFile(path.join(initial_path, "signup.html"));
})
app.get("/profile", function (req, res) {
const sessionCookie = req.cookies.session || "";
admin
.auth()
.verifySessionCookie(sessionCookie, true /** checkRevoked */)
.then((userData) => {
console.log("Logged in:", userData.email)
res.sendFile(path.join(initial_path, "profile.html"));
})
.catch((error) => {
res.redirect("/login");
});
});
app.get('/', (req, res) => {
res.sendFile(path.join(initial_path, "index.html"));
})
app.post("/sessionLogin", (req, res) => {
const idToken = req.body.idToken.toString();
const expiresIn = 60 * 60 * 24 * 5 * 1000; // вычисляем, сколько файл куки будет храниться (5 дней в миллисикундах)
admin
.auth()
.createSessionCookie(idToken, { expiresIn }) // создаем файл куки со сроком хранения
.then(
(sessionCookie) => {
const options = { maxAge: expiresIn, httpOnly: true }; // параметры (http only)
res.cookie("session", sessionCookie, options); // файл с парамертрами
res.end(JSON.stringify({ status: "success" }));
},
(error) => {
res.status(401).send("UNAUTHORIZED REQUEST!");
}
);
});
app.post("/sessionRegister", (req, res) => {
const idToken = req.body.idToken.toString();
const expiresIn = 60 * 60 * 24 * 5 * 1000; // вычисляем, сколько файл куки будет храниться (5 дней в миллисикундах)
admin
.auth()
.createSessionCookie(idToken, { expiresIn }) // создаем файл куки со сроком хранения
.then(
(sessionCookie) => {
const options = { maxAge: expiresIn, httpOnly: true }; // параметры (http only)
res.cookie("session", sessionCookie, options); // файл с парамертрами
res.end(JSON.stringify({ status: "success" }));
},
(error) => {
res.status(401).send("UNAUTHORIZED REQUEST!");
}
);
});
app.get("/sessionLogout", (req, res) => {
res.clearCookie("session");
res.redirect("/login");
});
app.listen("3000", () => {
console.log('listening......');
})
public/js/firebase.js
// Import the functions you need from the SDKs you need
import { initializeApp } from "https://www.gstatic.com/firebasejs/9.6.10/firebase-app.js";
import { getAnalytics } from "https://www.gstatic.com/firebasejs/9.6.10/firebase-analytics.js";
import { getFirestore } from "https://www.gstatic.com/firebasejs/9.6.10/firebase-firestore.js";
import { getAuth, setPersistence, signInWithRedirect, inMemoryPersistence } from "https://www.gstatic.com/firebasejs/9.6.10/firebase-auth.js";
// TODO: Add SDKs for Firebase products that you want to use
// https://firebase.google.com/docs/web/setup#available-libraries
// Your web app's Firebase configuration
// For Firebase JS SDK v7.20.0 and later, measurementId is optional
let firebaseConfig = {
// this my config
};
// Initialize Firebase
const app = initializeApp(firebaseConfig);
const analytics = getAnalytics(app);
export let db = getFirestore(app);
// Авторизация
const auth = getAuth();
setPersistence(auth, inMemoryPersistence)
public/js/register.js
import { getAuth, createUserWithEmailAndPassword, signOut, onAuthStateChanged } from "https://www.gstatic.com/firebasejs/9.6.10/firebase-auth.js";
let auth = getAuth();
window.addEventListener("DOMContentLoaded", () => {
document
.getElementById("register")
.addEventListener("submit", (event) => {
event.preventDefault();
const email = event.target.login.value;
const password = event.target.password.value;
console.log('Login: ' + email + ' Password: ' + password);
createUserWithEmailAndPassword(auth, email, password)
.then(({ user }) => {
return user.getIdToken().then((idToken) => {
return fetch("/sessionRegister", {
method: "POST",
headers: {
Accept: "application/json",
"Content-Type": "application/json",
"CSRF-Token": Cookies.get("XSRF-TOKEN"),
},
body: JSON.stringify({ idToken }),
});
});
})
.then(() => {
signOut(auth).then(() => {
window.location.assign("/profile");
}).catch((error) => {
console.log("Не удалось завершить сессию. Ошибка:" + error);
});
});
return false;
});
});
onAuthStateChanged(auth, user => {
if (user) {
console.log('Logged in as ${user.email}' );
} else {
console.log('No user');
}
});
Firebase 在用户登录时自动保留当前用户的凭据,并在 page/app 重新加载时尝试恢复这些凭据。要检测恢复何时完成或其他状态更改,您需要使用 so-called onAuthStateChanged
侦听器,如 getting the currently signed-in user 上的文档所示。从那里:
import { getAuth, onAuthStateChanged } from "firebase/auth";
const auth = getAuth();
onAuthStateChanged(auth, (user) => {
if (user) {
// User is signed in, see docs for a list of available properties
// https://firebase.google.com/docs/reference/js/firebase.User
const uid = user.uid;
// ...
} else {
// User is signed out
// ...
}
});