thắc mắc Token của firebase ko persisted

talatroi

Senior Member
Hello ae:beat_brick:, mình đang xài song song firebase làm auth, còn mongo thì làm database, ở FE thì mình dùng react,BE thì Nodejs,:sure: nay mình dùng hàm current user ở backend để làm nó giữ user đăng nhập, nhưng nó luôn bị expired token ngay lập tức từ token mình lấy về từ firebase, console ở network tab trả về: 401 unauthorized: ảnh=>
Screen-Shot-2022-02-23-at-11.49.15.png

mình có search stackoverflow có nói 2 lí do: là do ngày giờ làm token expired ngay lập tức, nhưng mình đã check ngày giờ bt.:what:
lí do 2 là phía firebase ko thể fix và có rất nhiều người bị phải gọi : getidtoken, hướng đi duy nhất là chỉ khi bấm logout mới disable cái token.
Ngay cả DN bằng Google token cũng expired nốt
Ae nào fix dc giúp mình với:sad:fix qua nay mà ko dc
controller.js BE
exports.currentUser = async (req, res) => {
User.findOne({ email: req.user.email }).exec((err, user) => {
if (err) throw new Error(err);
res.json(user);
});
};
App.js FE
useEffect(() => {

const unsubscribeFromAuth = onAuthStateChanged(auth, async (user) => {
if (user) {
let {token} = await user.getIdToken;
console.log(user)
try {
const res = await currentUser(token);
const { email, name, role, _id } = res.data;
dispatch({
type: userActionType.USER_LOGGED_IN,
payload: {
email,
name,
token,
role,
_id,
},
});

} catch (err) {

console.error(err);
}
}
});
return () => {
unsubscribeFromAuth();
};
}, [dispatch]);
Login.js FE(nơi gửi token lên BE check)
import React, { useState } from "react";
import { googleAuthProvider } from "../firebase";
import { getAuth, signInWithEmailAndPassword,signInWithPopup } from "firebase/auth";
import { toast } from "react-toastify";
import { Button } from "antd";
import { MailOutlined, GoogleOutlined } from "@ant-design/icons";
import { useDispatch } from "react-redux";
import userActionType from "redux/Actiontype/userType";
import { Link } from "react-router-dom";
import { useNavigate } from "react-router-dom";
import { createOrUpdateUser } from "function/auth";
const auth=getAuth();
const Login = () => {
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [setLoading] = useState(false);
const dispatch = useDispatch();
let navigate = useNavigate();
const roleRedirect = (res) => {
if (res.data.role === "admin") {
navigate("/admin/dashboard");
} else {
navigate("/user/history");
}
};

const handleSubmit = async (e) => {
e.preventDefault();
// setLoading(true);
try {
let result = await signInWithEmailAndPassword(auth,email, password);
const { user } = result;
const TokenResult = await user.getIdTokenResult();
createOrUpdateUser(TokenResult.token)
.then((res) => {
dispatch({
type: userActionType.USER_LOGGED_IN,
payload: {
name: res.data.name,
email: res.data.email,
token: TokenResult.token,
role: res.data.role,
_id: res.data._id,
},
});
console.log(res);
roleRedirect(res);
})
.catch((err) => console.log(err));
} catch (error) {
console.log(error);
toast.error(error.message);
}
};
const loginWithGoogle = async () => {

signInWithPopup(auth,googleAuthProvider)
.then(async (result) => {
const { user } = result;
const TokenResult = await user.getIdTokenResult();
createOrUpdateUser(TokenResult)
.then((res) => {
dispatch({
type: userActionType.USER_LOGGED_IN,
payload: {
name: res.data.name,
email: res.data.email,
token: TokenResult.token,
role: res.data.role,
_id: res.data._id,
},
});
roleRedirect(res);
})
.catch((err) => console.log(err));
})
.catch((error) => {
// setLoading(false);
toast.error("Login Error! Try again", error);
});
};
const loginForm = () => (
<form onSubmit={handleSubmit}>
<div className="form-group">
<input
type="email"
className="form-control"
value={email}
onChange={(e) => setEmail(e.target.value)}
placeholder="Your email"
autoFocus
/>
</div>
<div className="form-group">
<input
type="password"
className="form-control"
value={password}
onChange={(e) => setPassword(e.target.value)}
placeholder="Your password"
/>
</div>
<br />
<Button
onClick={handleSubmit}
type="primary"
className="mb-3"
block
shape="round"
icon={<MailOutlined />}
size="large"
disabled={!email || password.length < 6}
Login with Email/Password
</Button>
<Link to="/forgot/password" className="float-right text-danger">
Forgot Password
</Link>
</form>
);
return (
<div className="container p-5">
<div className="row">
<div className="col-md-6 offset-md-3">
<h4>Login</h4>
{loginForm()}
<Button
shape="round"
type="danger"
// className="btn btn-danger"
block
onClick={loginWithGoogle}
LOGIN WITH GOOGLE <GoogleOutlined />
</Button>
</div>
</div>
</div>
);
};
export default Login;
 
Back
Top