данные пользователя для входа в систему не сохраняются после обновления

#javascript #node.js #reactjs #express #sequelize.js

#javascript #node.js #reactjs #выражать #sequelize.js

Вопрос:

Привет, я использую express для внутренней аутентификации, и это мои функции / контроллеры входа в интерфейсе.

 export const signInUser = async credentials => {
    console.log('this is for the signInUser', credentials)
  try {
    const resp = await api.post('/sign-in', credentials)
    localStorage.setItem('token', resp.data.token)
    return resp.data
  } catch (error) {
    throw error
  }
}

    onSignIn = event => {
        event.preventDefault()

        const { history, setUser } = this.props
        signInUser(this.state)
            .then(res => setUser(res.user))
            .then(() => history.push('/Home'))
            .catch(error => {
                console.error(error)
                this.setState({
                    loginUsername: '',
                    loginPassword: '',
                })
            })
    }

setUser = user => this.setState({ user })
 

а это мой контроллер входа в систему на серверной части

 const signIn = async (req, res) => {
  try {
    console.log('hello' ,req.body);
    const { loginUsername, username, loginPassword } = req.body;
    const user = await User.findOne({
      where: {
        username: loginUsername
      }
    });
    console.log('this is the user', user)
    if (await bcrypt.compare(loginPassword, user.dataValues.password_digest)) {
      const payload = {
        id: user.id,
        username: user.username,
        password: user.password
      };
      const token = jwt.sign(payload, TOKEN_KEY);
      return res.status(201).json({ user, token });
    } else {
      res.status(401).send("Username or Password is invalid- try again.");
    }
  } catch (error) {
    return res.status(500).json({ error: error.message });
  }
};

 

Проблема в том, что состояние пользователя не сохраняется при обновлении, но у меня все еще есть json webtoken в моем локальном хранилище, и это проблема, когда я делаю запросы post и даже регистрируюсь, поскольку я перенаправляю на домашнюю страницу и теряю состояние пользователя. Любая помощь будет оценена!

Комментарии:

1. При обновлении localStorage не будет удален, поэтому у вас будет доступ к сохраненному токену. Но любая другая информация должна быть отправлена из бэкэнда во внешний интерфейс. Может ли серверная часть успешно отправить пользовательские данные?

2. Да, аутентификация и отправка пользовательских данных от начала к началу работают нормально.

Ответ №1:

Из ваших тегов я заметил, что вы используете React , поэтому решение простое!

у вас может быть GlobalAuthManager контекст для вашего приложения, который будет обертывать все компоненты на самом высоком уровне! после <React.strictMode> , как показано ниже:

 
<React.StrictMode>
  <GlobalAuthManager.Provider value={{authData}}>
    <App />
  </GlobalAuthManager.Provider>
</React.StrictMode>

 

Как вы можете догадаться, это будет контекст! это предоставит вам ваши пользовательские данные для всех ваших компонентов!

Шаблон:

1. Сохранить токен:

когда ваш пользователь войдет в ваше приложение, вы получите токен (в своем ответе или в заголовке ответа), вам нужно сохранить значение токена в localstorage или, что еще лучше, в хранилище файлов cookie (об этом есть много статей, почему), одна из них здесь.

2. иметь /getUserData конечную точку в серверной части:

вам необходимо иметь /getUserData конечную точку в бэкэнде для повторного просмотра ваших пользовательских данных на основе токена

3. вызовите /getUserData монтирование приложения:

перед каждой вещью в вашем приложении вам нужно вызвать эту конечную точку, если вы найдете токен в localstorage или хранилище файлов cookie. так что, если вы запустите это в своей componnetDidMount или useEffect(() => { ... }, []) , это сработает!

4. храните свои пользовательские данные и состояние в контексте:

после того, как вы вызвали /getUserData и если у вас был действительный токен (я имею в виду токен с истекшим сроком действия или не прерванный и отредактированный токен), вы получите пользовательские данные, и что вам нужно сделать, так это сохранить это в вашем GlobalAuthManager и предоставить это в свой глобальный компонент приложения!

после этого вам будут доступны ваши пользовательские данные, которые вы можете выбрать, чтобы показать кнопку входа или регистрации на панели навигации или отключить / включить раздел комментариев, например, на основе ваших пользовательских данных!

Подводя итог: итак, ключ в том, что у вас должен быть a GlobalAuthManager только для одной цели, чтобы перед каждой вещью он запускался на верхнем уровне вашего приложения и получал ваши пользовательские данные на основе предоставленного токена из localstorage или хранилища файлов cookie!

после этого вы можете управлять состоянием своего приложения в зависимости от того, вошел ваш пользователь в систему или нет!