reactjs – react-boilerplate authentication登录页面在页面重
|
我正在开发一个带有登录页面和应用程序其余页面的应用程序(应登录查看).我正在使用
react-boilerplate.从这个
example,我编辑了我的asyncInjectors.js文件,以获得redirectToLogin和redirectToDashboard方法:
//asyncInjectors.js
export function redirectToLogin(store) {
return (nextState,replaceState) => {
const isAuthenticated = store.getState().get('app').get('isAuthenticated');
if (!isAuthenticated) {
replaceState({
pathname: '/login',state: {
nextPathname: nextState.location.pathname,},});
}
};
}
export function redirectToDashboard(store) {
return (nextState,replaceState) => {
const isAuthenticated = store.getState().get('app').get('isAuthenticated');
if (isAuthenticated) {
replaceState('/');
}
}
}
然后我只将redirectToLogin设置为页面的onEnter,并将redirectToDashboard设置为登录页面. 它工作正常,但在登录时页面刷新(F5)时,登录页面会短暂呈现,然后呈现实际页面.登录页面只在componentWillMount中调度验证操作,然后在componentDidUpdate中重定向: //login.js
componentWillMount() {
this.props.dispatch(authenticate());
}
componentDidUpdate(prevProps,prevState) {
if (this.props.isAuthenticated) {
const nextPathname = prevProps.location.state ? prevProps.location.state.nextPathname : '/';
browserHistory.push(nextPathname);
}
}
页面的容器也具有相同的componentWillMount代码.不确定是不是因为传奇,但这里是代码: //sagas.js
export function* login({ user,password }) {
try {
const token = yield call(app.authenticate,{
strategy: 'local',user,password,});
return token;
} catch (error) {
return onError(error);
}
}
// For page refresh after logging in
export function* authenticate() {
try {
const token = yield call(app.authenticate);
return token;
} catch (error) {
return onError(error);
}
}
export function* logout() {
try {
const response = yield call(app.logout);
return response;
} catch (error) {
return onError(error);
}
}
export function* loginFlow() {
while (true) {
const request = yield take(LOGIN_REQUEST);
const winner = yield race({
auth: call(login,request.data),logout: take(LOGOUT_REQUEST),});
if (winner.auth && winner.auth.accessToken) {
yield put(actions.setAuthState(true));
}
}
}
export function* logoutFlow() {
while (true) {
yield take(LOGOUT_REQUEST);
yield put(actions.setAuthState(false));
yield call(logout);
browserHistory.push('/login');
}
}
export function* authenticateFlow() {
while (true) {
yield take(AUTHENTICATE);
const response = yield call(authenticate);
if (response && response.accessToken) {
yield put(actions.setAuthState(true));
}
}
}
export default [
loginFlow,logoutFlow,authenticateFlow,];
如何摆脱闪烁的登录页面? 编辑: //asyncInjectors.js
import jwtDecode from 'jwt-decode';
export function redirectToLogin(store) {
return (nextState,replaceState,callback) => {
const token = localStorage.token;
if (token) {
const jwt = jwtDecode(token);
if (jwt.exp <= (new Date().getTime() / 1000)) {
store.dispatch(actions.setAuthState(false));
replaceState({
pathname: '/login',state: {
nextPathname: nextState.location.pathname,});
}
}
store.dispatch(actions.setAuthState(true));
callback();
};
}
当我点击刷新时,登录页面没有显示,但现在我无法注销. 解决方法
您有两种方法可以避免在初始渲染时刷新登录页面:使您的身份验证功能同步或等待加载页面的答案.
1-检查您的令牌是否存在且有效(到期日期)客户端,以选择是否必须首先将用户重定向到登录或仪表板页面.当答案从您的服务器返回时,您可以更正您的初始猜测,但在大多数情况下您不需要. 用户登陆 – > >检查令牌客户端 – >如果需要,重定向到登录 要检查令牌客户端,您必须检查本地存储.例如: class App extends Component {
requireAuth = (nextState,replace) => {
if (!localStorage.token) {
replace({
pathname: '/login',state: { nextPathname: nextState.location.pathname }
})
}
}
render() {
return (
<Router history={browserHistory}>
<Route path="/login" component={LoginPage} />
<Route
path="/"
component={AppLayout}
onEnter={this.requireAuth}
> ... </Route>
)
}
}
如果您使用具有相对较短的到期日期的令牌,则还必须检查到期日期,从而解码令牌. try {
const jwt = JWTdecode(token);
if (moment().isBefore(moment.unix(jwt.exp))) {
return nextState;
} else {
replace({
pathname: '/login',state: { nextPathname: nextState.location.pathname }
})
}
} catch (e) {
replace({
pathname: '/login',state: { nextPathname: nextState.location.pathname }
})
}
2-在从服务器收到答案之前显示加载屏幕.在不透明度上添加一些Css过渡效果以避免“闪光” (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
