我有一個使用 firebase auth 進行身份驗證的反應應用程式。
一個人登錄后,它會將他們重定向到書籍頁面。這是 submitLogin 處理程式
import { auth, firebase } from "./firebase";
async function googleLogin() {
const provider = new firebase.auth.GoogleAuthProvider();
await auth.signInWithPopup(provider).then(
async (result) => {
const token = await auth?.currentUser?.getIdToken(true);
if (token) {
localStorage.setItem("@token", token);
navigate("/book-list");
}
},
function (error) {
console.log(error);
}
);
}
然后在書籍頁面中,我嘗試獲取currentUser以便可以呼叫getIdToken(),但currentUser回傳 null。
import { auth } from "./firebase";
const currentUser = auth.currentUser
這是 firebase.js 檔案:
import firebase from 'firebase/compat/app';
import 'firebase/compat/auth';
import 'firebase/compat/firestore';
const firebaseConfig = {...};
firebase.initializeApp(firebaseConfig);
const auth = firebase.auth();
export { auth, firebase };
currentUser用戶登錄后如何從另一個檔案呼叫?
uj5u.com熱心網友回復:
這是預期的行為。由于書籍頁面是一個新頁面,Firebase SDK 需要從本地存盤中恢復身份驗證狀態,并自動將其持久化。這要求它呼叫服務器,例如檢查帳戶是否已被禁用。由于我們無法阻止頁面加載,因此您的主代碼繼續執行并看到它currentUser為空。
相反,您要做的是監聽用戶的身份驗證狀態,如獲取當前用戶的檔案中的第一個片段所示:
firebase.auth().onAuthStateChanged((user) => {
if (user) {
// User is signed in, see docs for a list of available properties
// https://firebase.google.com/docs/reference/js/firebase.User
var uid = user.uid;
// ...
} else {
// User is signed out
// ...
}
});
此回呼將在用戶會話恢復時自動觸發,或者失敗時,或者從沒有登錄用戶開始,或者身份驗證狀態發生變化時,因此是更新應用程式的理想場所最新的身份驗證狀態。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/452889.html
