I'm adding authentication into my app, which uses react-router. I've patterned the client routing after the auth-flow example in react-router, but using passport instead of the localstorage that the example uses. this all works fine.
The next step is protecting routes I am defining for express in server.js
. I could send a redirect to /#/login
, but this feels brittle. What's the best way to derive a URL on the server side to a login route served by react-router?
Here's what I have now in my server.js
, which works, but feels brittle:
app.get('/protected',
// redirecting to #/login seems bad: what if we change hashhistory, etc.
passport.authenticate('local', { failureRedirect: '/#/login'}),
function(req, res) {
res.render('whatever');
});
Config route on express to get all routes and routing with react-router, in this way, ejem. (I hope this can help you)
server.js
import express from 'express'
import path from 'path'
const app = express();
app.use(express.static(__dirname + '/public'));
app.get('*', (req,res) => res.sendFile(path.join(__dirname+'/public/index.html'))).listen(3000,() => console.log('Server on port 3000'))
routes.jsx
import React from 'react'
import ReactDOM from 'react-dom'
import { Router, Route, Link, browserHistory, IndexRedirect } from 'react-router'
import App from '../views/app.jsx'
const Routes = React.createClass({
render(){
return(
<Router history={ browserHistory }>
<Route path="/" component={App}>
<IndexRedirect to="/dashboard"/>
<Route path="dashboard" name="Dashboard" component={App} />
<Route path="pages" name="Pages" component={Pages} />
<Route path="/:Id" component={Page}/>
<Route path="/:Id/inbox" name=':ids' component={Inbox}/>
</Route>
<Route path="*" component={App}>
<IndexRedirect to="/dashboard" />
</Route>
</Router>
);
}
});
ReactDOM.render(<Routes />, document.getElementById('app'))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With