Я разрабатываю приложение PERN с полным стеком, используя React / Redux, Knex + Objection.Js + PostgreSQL для БД и feathersjs для инфраструктуры API. Поэтому я использую @feathersjs/client
и для внешнего интерфейса, и для пакета аутентификации. Я также использую connected-react-router
для своей маршрутизации. К сожалению, всякий раз, когда я пытаюсь перейти к защищенному маршруту, запрос на вход в систему, отвечающий за настройку состояния пользователя (от его аутентификации jwt на сервере), не завершается, пока перенаправление не приведет пользователя на страницу входа.
Я проверяю jwt в файле index.js
приложения реагирования, отправляя действие.
if (localStorage['feathers-jwt']) {
try {
store.dispatch(authActions.login({strategy: 'jwt', accessToken: localStorage.getItem('feathers-jwt')}));
}
catch (err){
console.log('authenticate catch', err);
}
}
Действие подобрано redux-saga
, которое выполняет следующее действие
export function* authSubmit(action) {
console.log('received authSubmit');
try {
const data = yield call(loginApi, action);
yield put({type: authTypes.LOGIN_SUCCESS, data});
} catch (error) {
console.log(error);
yield put({type: authTypes.LOGIN_FAILURE, error})
}
}
function loginApi(authParams) {
return services.default.authenticate(authParams.payload)
}
Вот моя isAuthenticated
функция с объектом конфигурации:
const isAuthenticated = connectedReduxRedirect({
redirectPath: '/login',
authenticatedSelector: state => state.auth.user !== null,
redirectAction: routerActions.replace,
wrapperDisplayName: 'UserIsAuthenticated'
});
Вот HOC, применяемый к компонентам контейнера
const Login = LoginContainer;
const Counter = isAuthenticated(CounterContainer);
const LoginSuccess = isAuthenticated(LoginSuccessContainer);
И, наконец, вот рендер
export default function (store, history) {
ReactDOM.render(
<Provider store={store}>
<ConnectedRouter history={history}>
<Switch>
<Route exact={true} path="/" component={App}/>
<Route path="/login" component={Login}/>
<Route path="/counter" component={Counter}/>
<Route path="/login-success" component={LoginSuccess}/>
<Route component={NotFound} />
</Switch>
</ConnectedRouter>
</Provider>,
document.getElementById('root')
);
}
То, что я ожидаю, например, при входе в систему и посещении, /counter
- это следующее
Выполнено действие LOGIN_REQUEST
Сработало действие LOGIN_SUCCESS, пользователь аутентифицирован JWT
маршрутизатор видит, что объект user.auth не равен нулю, поэтому пользователь
Заверенные
маршрутизатор разрешает навигацию без перенаправления
Вместо этого я вижу следующее (при переходе вручную к /counter
)
@@ INIT
auth / LOGIN_REQUEST [это хорошо, loggingIn: true
]
@@ router / LOCATION_CHANGE
{
type: '@@router/LOCATION_CHANGE',
payload: {
location: {
pathname: '/counter',
search: '',
hash: ''
},
action: 'POP',
isFirstRendering: true
}
}
- @@ router_LOCATION_CHANGE [это проблема]
type: '@@router/LOCATION_CHANGE',
payload: {
location: {
pathname: '/login',
hash: '',
search: '?redirect=%2Fcounter',
key: 'kdnf4l'
},
action: 'REPLACE',
isFirstRendering: false
}
}
Пользователь переходит к /login
, который выводит пользователя из системы в соответствии с его текущим дизайном.
LOGOUT_REQUEST -> LOGIN_SUCCESS -> LOCATION_CHANGE (до /login-success
)
Опять же, любая помощь будет принята с благодарностью, и я могу предоставить все, что потребуется.
Спасибо!
-Brenden