【发布时间】:2019-04-19 01:52:11
【问题描述】:
我正在使用 React/Redux、Knex + Objection.Js + PostgreSQL 为 DB 和 feathersjs 为 API 框架开发一个全栈 PRN 应用程序。因此,我也在前端使用@feathersjs/client 及其身份验证包。我也在使用connected-react-router 进行路由。不幸的是,每当我尝试导航到受保护的路由时,负责设置用户状态的“登录”请求(从他们的 jwt 与服务器进行身份验证)在重定向将用户带到登录页面之前不会完成。
我正在通过调度一个操作来验证 react 应用程序的 index.js 文件中的 jwt。
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)
再次,我们将不胜感激任何帮助,如果需要,我可以提供其他任何东西。
谢谢!
-布伦登
【问题讨论】:
标签: reactjs redux jwt redux-saga feathersjs