React: можно ли проверять cookies на наличие токена обновления?

#javascript #reactjs

#javascript #reactjs

Вопрос:

Я создал страницу входа в систему, которая должна войти username и password для аутентификации. После аутентификации я push history подключаюсь к Homepage с помощью react-router и устанавливаю cookie . Код похож:

 const handleLogin = () =>{
        const options = {
            url: "http://test/login",
            method: "POST",
            withCredentials: true,
            headers:{
                "Accept": "application/json",
                "content-Type": "application/json;charset-UTF-8"
            },
            data: {
                "username": user,
                "password": pass,
            }
        };
        Axios(options).then(Response =>{
            if(Response.data.JWT){
                let decode = jwt_decode(Response.data.JWT);
                if(decode.id){
                    setLoginUser(decode.username);
                    setAuthenticated(true);
                    history.push('/Homepage');
                    Cookies.set("isLogged", {expires: 1} )
                }
            }else{
                alert("Invalid user");
            }  
        });
    }
  

Я также использовал JWT из серверной части, здесь приложение работает нормально. Но когда я обновляю веб-страницу, я проверяю через файлы cookie, чтобы токен обновления оставался на домашней странице, и удаляю его для выхода из системы.

 const readCookie = () => {
    let user = false;
    if(user = Cookies.get("isLogged")){
        history.push('/Homepage');
        setAuthenticated(true);
    }else{
        history.push('/');
    }
}
useEffect(() => {
    readCookie()
},[]);
  

Можно ли получить токен обновления таким образом?

Ответ №1:

Ваша функция снаружи должна зависеть от вашей useEffect . Чтобы избежать этого, просто переместите его внутрь хука. В остальном, на мой взгляд, все хорошо. Чтение файлов cookie является побочным эффектом, поэтому вы делаете это правильно.

 useEffect(() => {
  const readCookie = () => {
    let user = false;
    if(user = Cookies.get("isLogged")){
        history.push('/Homepage');
        setAuthenticated(true);
    }else{
        history.push('/');
    }
  }

  readCookie()
},[]);
  

Если вы хотите оставить его readCookies за пределами хука, вам придется обернуть его в useCallback хук и использовать в своей зависимости, вот так:

 const readCookiesCallback = useCallback(() => {/* your read cookies code */}, [])

useEffect(() => {
  readCookiesCallback()
}, [readCookiesCallback])
  

Для того, что вы делаете, в этом нет необходимости. Мой первый пример — это путь.