Самый быстрый способ сохранить статус аутентификации пользователя - это использовать useContext
хуки.
- создайте файл
Authcontext.js
и определите, что у вас будет в вашем контексте (но только тип данных, вы можете видеть, что нам не нужно определять setIsAuthenticated
здесь.
import React from 'react';
export default React.createContext({
isAuthenticated: false,
setIsAuthenticated: (value) => {},
});
- Теперь в главном компоненте вы можете обернуть все приложение в контекст. Здесь мы определяем функцию
setIsAuthenticated
и начальное значение isAuthenticated
.
const App = () => {
const [isAuthenticated, setIsAuthenticated] = useState(AuthAPI.setupUser());
return (
<AuthContext.Provider value={{
isAuthenticated,
setIsAuthenticated
}}>
<AppContent />
</AuthContext.Provider>
);
};
ReactDOM.render(<App/>, document.getElementById('app'));
export default App;
Поскольку контекст является глобальным состоянием (в виде избыточности), вы также можете получить контекст от каждого компонента, например.
import React, { useContext } from 'react';
const Logout = () => {
const { setIsAuthenticated } = useContext(AuthContext);
const logout = () => {
AuthAPI.logout();
setIsAuthenticated(false);
};
return(...)
Чтобы определить, подключен ли пользователь, вы должны создать его. собственный лог c, но если вы используете jwt, setupUser
может выглядеть примерно так: он будет вызываться каждый раз, когда приложение начинает настраивать ax ios для вашего вызова API, например, и возвращать вам статус пользователь.
function setupUser() {
// check if token exist
const token = window.localStorage.getItem('authToken');
if (token) {
const { exp: expirationDate } = jwtDecode(token);
if (expirationDate * 1000 > new Date().getTime()) {
axios.defaults.headers['Authorization'] = 'Bearer ' + token;
return true;
}
}
return false;
}