talatroi
Senior Member
Hello ae, 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, 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=>
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.
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ớifix qua nay mà ko dc
controller.js BE
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.
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ớifix qua nay mà ko dc
controller.js BE
App.js FEexports.currentUser = async (req, res) => {
User.findOne({ email: req.user.email }).exec((err, user) => {
if (err) throw new Error(err);
res.json(user);
});
};
Login.js FE(nơi gửi token lên BE check)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]);
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;