Node.js 如何在身份验证中检查令牌

Node.js 如何在身份验证中检查令牌,node.js,reactjs,mongodb,express,authentication,Node.js,Reactjs,Mongodb,Express,Authentication,我正试图与MERN进行第一次身份验证,但我遇到了一个问题。我有一个表单,在提交时检查输入值,如果没有问题,应该打开主页。我可以在控制台中看到一切正常,我在cookies中看到一个令牌,但我仍然无法打开主页。 我可以看出问题出在useToken.js中,但我完全陷入其中,因为我无法将localStorage更改为Cookie。 (该项目非常基础,我不需要任何验证,我只需要在登录时查看其他组件) 非常感谢你的帮助。 GitHub存储库(如果需要)。 Auth.js import useToken

我正试图与MERN进行第一次身份验证,但我遇到了一个问题。我有一个表单,在提交时检查输入值,如果没有问题,应该打开主页。我可以在控制台中看到一切正常,我在cookies中看到一个令牌,但我仍然无法打开主页。 我可以看出问题出在useToken.js中,但我完全陷入其中,因为我无法将localStorage更改为Cookie。 (该项目非常基础,我不需要任何验证,我只需要在登录时查看其他组件) 非常感谢你的帮助。 GitHub存储库(如果需要)。

Auth.js

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) {