У меня возникла крошечная проблема, которая не позволяет мне понять, как мне наиболее эффективно деаутентифицировать пользователя в моем приложении React / Redux. (Также с использованием Redux Thunk).
Получить токен с сервера совсем несложно. В настоящее время я:
- Send POST request with email and pw
- Receive Token back from server
- Save it to local storage.
Любые дополнительные запросы к серверу после этого требуют прикрепления токена внутри заголовка AUTHORIZATION, что нормально.
Допустим, я ухожу из приложения после некоторого времени входа в систему, затем возвращаюсь и решаю попробовать просмотреть другой защищенный маршрут. Назовем этот маршрут «/ latest-videos», который отправляет запрос AJAX для получения последних видео.
Когда этот запрос отправляется, сервер определяет, что срок действия моего токена истек, и не разрешает мне доступ к этому ресурсу. Очевидно, именно здесь я хотел бы реализовать в Redux какой-то тип создателя действий, который будет перенаправлять пользователя на страницу входа.
Нужно ли мне выполнять какую-либо проверку каждого запроса AJAX, чтобы узнать, истек ли срок действия токена? Похоже, что для этого потребуется ненужный шаблон в каждом файле, в котором у меня написан запрос AJAX.
Вот тут-то у меня и становится грязно. Если мы предположим, что у токена есть предопределенная дата истечения срока действия, как я могу деаутентифицировать пользователя наиболее эффективным способом, не забивая свое приложение плохим выбором дизайна кода?
Вы можете предположить, что у меня есть папка в моем приложении под названием «действия», которая содержит такие файлы:
- actions
- videos.js
- users.js
- projects.js
- ...
В данном файле внутри папки действий у вас может быть несколько преобразователей, выполняющих вызовы AJAX. Вот шаблонный пример того, как может выглядеть один из них:
export function fetchVideos(query) {
return async (dispatch) => {
try {
dispatch({ type: FETCH_VIDEOS })
let res = await axios.post(`${API_URL}/videos/search`, {
query: query
})
// dispatch some success action creator with the data
}
catch(e) {
console.error('ERROR FETCHING VIDEOS: ' + e)
dispatch({ type: FETCH_VIDEOS_FAILED })
}
}
}
Надеюсь, я понимаю ... любая помощь будет оценена по достоинству.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Нет необходимости проверять токен в вашем приложении для реагирования. Ваш сервер должен проверять действительность / истечение срока действия вашего токена при каждом запросе.
Поскольку мы говорим о клиентском приложении, потребляющем спокойные вызовы API, сервер должен ограничивать ресурсы при недопустимом токене и возвращать ответ 401 неавторизованный.
После этого ответа клиентское приложение должно деаутентифицировать пользователя и перенаправить на страницу входа (или отправить запрос с токеном обновления, если он у вас есть, чтобы избежать ненужных действий при входе в систему).
Верно. Между сервером и клиентом должен быть договор, чтобы знать, когда ваша авторизация не удалась. Вместо того, чтобы писать эту проверку в каждом из блоков catch, вы, возможно, могли бы избавиться от этого, написав отдельный сервис или класс, который обрабатывает вашу сетевую логику, или мог бы использовать перехватчики axios.
Спасибо чувак. Да, это было для меня одной большой проблемой - стараться сушить как можно дольше. Я обязательно ознакомлюсь с вашими рекомендациями
Да, я имею в виду то, что я имел в виду. Итак, в каждом блоке catch каждого запроса ajax мне нужно проверять 401 неавторизованный?