Node.js 如何在身份验证中检查令牌
我正试图与MERN进行第一次身份验证,但我遇到了一个问题。我有一个表单,在提交时检查输入值,如果没有问题,应该打开主页。我可以在控制台中看到一切正常,我在cookies中看到一个令牌,但我仍然无法打开主页。 我可以看出问题出在useToken.js中,但我完全陷入其中,因为我无法将localStorage更改为Cookie。 (该项目非常基础,我不需要任何验证,我只需要在登录时查看其他组件) 非常感谢你的帮助。 GitHub存储库(如果需要)。 Auth.jsNode.js 如何在身份验证中检查令牌,node.js,reactjs,mongodb,express,authentication,Node.js,Reactjs,Mongodb,Express,Authentication,我正试图与MERN进行第一次身份验证,但我遇到了一个问题。我有一个表单,在提交时检查输入值,如果没有问题,应该打开主页。我可以在控制台中看到一切正常,我在cookies中看到一个令牌,但我仍然无法打开主页。 我可以看出问题出在useToken.js中,但我完全陷入其中,因为我无法将localStorage更改为Cookie。 (该项目非常基础,我不需要任何验证,我只需要在登录时查看其他组件) 非常感谢你的帮助。 GitHub存储库(如果需要)。 Auth.js import useToken
import useToken from "../Components/useToken";
export default function Auth() {
const Body = styled.section`
min-height: 550px;
min-width: 319.98px;
background: linear-gradient(
0deg,
rgba(213, 189, 238, 1) 0%,
rgba(166, 124, 232, 1) 100%
);
padding-top: 40px;
position: relative;
`;
const { token, setToken } = useToken();
if (!token) {
return (
<>
<Body>
<Logo />
<Login setToken={setToken} />
</Body>
<Socials />
</>
);
}
return (
<>
<BrowserRouter>
<Switch>
<Route path="/">
<MainPage />
</Route>
</Switch>
</BrowserRouter>
</>
);
}
后端路由
router.post('/register', async (req, res) => {
try {
const { email, password } = req.body;
if (!isEmail(email)) {
throw new Error('Email must be a valid email address.');
}
if (typeof password !== 'string') {
throw new Error('Password must be a string.');
}
const user = new User({ email, password });
const persistedUser = await user.save();
const userId = persistedUser._id;
const session = await initSession(userId);
res
.cookie('token', session.token, {
httpOnly: true,
sameSite: true,
maxAge: 1209600000,
secure: process.env.NODE_ENV === 'production',
})
.status(201)
.json({
title: 'User Registration Successful',
detail: 'Successfully registered new user',
csrfToken: session.csrfToken,
});
} catch (err) {
res.status(400).json({
errors: [
{
title: 'Registration Error',
detail: 'Something went wrong during registration process.',
errorMessage: err.message,
},
],
});
}
});
router.post('/login', async (req, res) => {
try {
const { email, password } = req.body;
if (!isEmail(email)) {
return res.status(400).json({
errors: [
{
title: 'Bad Request',
detail: 'Email must be a valid email address',
},
],
});
}
if (typeof password !== 'string') {
return res.status(400).json({
errors: [
{
title: 'Bad Request',
detail: 'Password must be a string',
},
],
});
}
const user = await User.findOne({ email });
if (!user) {
throw new Error();
}
const userId = user._id;
const passwordValidated = await bcrypt.compare(password, user.password);
if (!passwordValidated) {
throw new Error();
}
const session = await initSession(userId);
res
.cookie('token', session.token, {
httpOnly: true,
sameSite: true,
maxAge: 1209600000,
secure: process.env.NODE_ENV === 'production',
})
.json({
title: 'Login Successful',
detail: 'Successfully validated user credentials',
csrfToken: session.csrfToken,
});
} catch (err) {
res.status(401).json({
errors: [
{
title: 'Invalid Credentials',
detail: 'Check email and password combination',
errorMessage: err.message,
},
],
});
}
});
问题不在cookie和本地存储之间。这是因为你从来没有真正设置令牌 在您的
Login.js
中,您应该在内部调用props.setToken(res)
axios
.post("/api/users/login", user)
.then((res) => {
//Call it here
}
此外,您还需要确保登录组件传递了其道具:
export default function Login(props) {
谢谢你的回答,但我还是不明白。老实说,我试过这样做,但什么也没有得到。你能解释一下吗?我到底应该通过哪些道具?我试图传递令牌,但它不起作用。我真的不明白,因为我只是在学习,这对我来说很难,所以我非常感谢你的帮助。提前感谢您在您编写的
Auth.js
中,您编写的
意味着您将setToken
作为道具传递给登录组件。但在登录组件中,实际上并没有使用setToken
。根据我的理解,我认为在获得axios帖子的结果后,您可能需要使用setToken(代码片段1),而要使用setToken,您需要先使用道具。(片段2)
export default function Login(props) {