Вам в любом случае нужно будет хранит access, refresh, access_expires_in, refresh_expires_in в каком-то защищённом месте недоступном для других приложений но доступном из js. Я использую для этого localStorage.
Так что хранить эти данные в redux, равно как и отправлять их туда через dispatch не нужно, пусть localStorage будет единственным источником правды. Ничего специфичного для реакта здесь тоже нет.
Напишите свой небольшой сервис auth который будет инкапсулировать в себе логику проверки токенов на актуальность, авторизацию, аутентификацию, обновления токенов, их очистки и хранения в localStorage.
Перед каждым запросом делайте проверку аксесс токена, если он заекспайрился, то делайте рефреш откладывая все последующие запросы до его резолва, если рефреш не удался то просто кидайте пользователя на логин. В этом вам может помочь axios intercepters.
С остальными я думаю вы разберётесь :)
Также почитать про то как хорошо организовать работу с токеновми можно здесь
https://gist.github.com/zmts/802dc9c3510d79fd40f9d...