Ho qualche problema con l'autenticazione con redux e react router e spero di avere qualche chiarimento su come risolvere al meglio il mio problema.Universal Auth Redux & React Router
Ho un componente di accesso che, se presentate invia la seguente azione:
export const loginUser = (creds) => {
return dispatch => {
dispatch(requestLogin(creds))
return fetch('http://127.0.0.1:4000/api/login', {
...
})
.then(res => {
dispatch(receiveLogin())
browserHistory.push('/admin')
...
})
...
}
}
L'azione receiveLogin aggiorna la bandiera isAuthenticated nello stato true. Il mio percorso protetto ha il seguente hook onEnter:
export default (state) => {
return {
path: '/',
component: App,
childRoutes: [
{
path: 'protected',
component: Protected,
...
onEnter(nextState, replaceState) {
const loggedIn = //check state.isAuthenticated
if (!loggedIn) {
replaceState(null, 'login')
}
}
}
]
}
}
Come puoi vedere, sto passando lo stato come argomento. Questo mi dà accesso allo stato iniziale dal server e dal client. Tuttavia, dopo che si è verificata l'azione di accesso, ovviamente il gancio onEnter continuerà a utilizzare lo stato iniziale.
Quello che voglio sapere è il modo migliore per ottenere lo stato corrente dopo che il flag isAuthenticated è stato aggiornato e usarlo invece nel mio hook onEnter. Oppure, il mio approccio è totalmente errato e dovrei farlo in un modo completamente diverso?
Ho un problema simile a quello di Andrew, ma sto usando HOC. Il mio problema è che l'utente non può accedere, perché controlla sempre lo stato corrente prima che la risposta ritorni dal server - e questo significa che l'utente non può accedere. C'è un modo per limitare il controllo nel negozio redux? – Abdi
@Abdi si ho trovato un problema simile qui: https://github.com/mjrussell/redux-auth-wrapper/issues/30. Penso che la soluzione sia semplicemente aggiungere un flag al tuo redux store (isUserFetched) o qualcosa di simile e se è vero - invece di eseguire il reindirizzamento, mostra una pagina alternativa nel HOC invece del componente spostato. (come una pagina di caricamento). Voglio aggiungerlo presto alla mia libreria, non ho ancora avuto il tempo – mjrussell
In realtà sono riuscito a risolvere il problema senza ricorrere a una pagina centrale. Ho usato redux-thunk, che rende l'azione in attesa di risoluzione, quindi aggiorno lo stato e quindi reindirizzo. Spero che questo abbia senso, ma se hai un problema simile, controlla [redux-thunk] (https://github.com/gaearon/redux-thunk). Ho anche trovato questo repo molto utile poiché stava facendo ciò che volevo implementare [HOC con autenticazione] (https://github.com/joshgeller/react-redux-jwt-auth-example) – Abdi