使用React上下文的用户身份验证

时间:2020-09-13 18:32:18

标签: reactjs

我不确定为什么这不起作用。调用login函数时,除行user = res.headers['access-token'];外,其他所有东西都起作用。 user仍未定义。我的身份验证系统基于以下内容:https://kentcdodds.com/blog/authentication-in-react-applications

import React from 'react';
import axios from 'axios';

const AuthContext = React.createContext();
const url = 'http://localhost:3001/auth/sign_in';

function AuthProvider(props) {
  let user;

  async function login(e, email, password) {
    e.preventDefault();
    try {
      const res = await axios({
        method: 'post',
        url: url,
        data: JSON.stringify({ email, password }),
        headers: { 'Content-Type': 'application/json' }
      });
      localStorage.setItem('token', res.headers['access-token']);
      localStorage.setItem('client', res.headers['client']);
      localStorage.setItem('uid', res.headers['uid']);
      user = res.headers['access-token'];
      console.log('Logged in');
    } catch (err) {
      console.log(err);
    }
  }

  return (
    <AuthContext.Provider
      value={{ user, login, logout, register }}
      {...props}
    />
  );
}

const useAuth = () => React.useContext(AuthContext);

export { AuthProvider, useAuth };

2 个答案:

答案 0 :(得分:1)

原来我要做的就是使用useState

function AuthProvider(props) {
  const [user, setUser] = useState();

  async function login(e, email, password) {
    e.preventDefault();
    try {
      const res = await axios({
        method: 'post',
        url: url,
        data: JSON.stringify({ email, password }),
        headers: { 'Content-Type': 'application/json' }
      });
      localStorage.setItem('token', res.headers['access-token']);
      localStorage.setItem('client', res.headers['client']);
      localStorage.setItem('uid', res.headers['uid']);
      setUser(res.headers['access-token']);
      console.log('Logged in');
    } catch (err) {
      console.log(err);
    }
  }

  return (
    <AuthContext.Provider
      value={{ user, login, logout, register }}
      {...props}
    />
  );
}

答案 1 :(得分:0)

这是因为要检索令牌,您需要使用getItem()函数。

因此,根据您的情况,而不是: user = res.headers['access-token'];

您将需要通过以下方式检索值: user = localStorage.getItem('token')

尝试一下,让我知道它是否可以按您的要求工作。