reactjs - 使用 React Router 保护 React 应用程序中的路由
问题描述
我用 , 创建了一个简单的应用React
程序Redux
,它处理用户身份验证。React Router
Auth0
我正在尝试创建这种基本行为来控制访问:
- 所有未经身份验证的用户将被自动发送到
/public
- 经过身份验证的用户可以访问应用程序的所有其他部分
- 一旦用户通过身份验证
Auth0
,我想处理access_token
并将用户发送到/
哪个是Home
组件
一切都“几乎”按应有的方式工作。我遇到的问题是render()
函数 inApp.jsx
在lock.on('authenticated')
侦听器甚至有机会处理Auth0
. 结果,令牌永远不会被存储,并且用户似乎总是未经身份验证。如果我将用户发送到/login
,一切正常,因为我没有在呈现Login
组件之前检查用户是否经过身份验证。
我认为我处理受保护路由的方式需要改变。关于如何处理受保护的路线有什么建议吗?
我在这里提供您需要的代码。如果您想查看整个应用程序,请转到https://github.com/imsam67/react-redux-react-router-auth0-lock
以下是App.jsx
:
class App extends Component {
render() {
const isAuthed = isAuthenticated();
return (
<div>
<Switch>
<Route exact path="/" render={ props => isAuthed ? <Home {...props} /> : <Redirect to="/public" /> } />
<Route exact path="/login">
<Login />
</Route>
<Route path="/public">
<Public />
</Route>
</Switch>
</div>
);
}
}
这是AuthWrapper
我处理的组件Auth0
:
class AuthWrapper extends Component {
constructor(props) {
super(props);
this.onAuthenticated = this.onAuthenticated.bind(this);
this.lock = new Auth0Lock('my_auth0_client_id', 'my_domain.auth0.com', {
auth: {
audience: 'https://my_backend_api_url',
redirectUrl: 'http://localhost:3000/',
responseType: 'token id_token',
sso: false
}
});
this.onAuthenticated();
}
onAuthenticated() {
debugger; // After successful login, I hit this debugger
this.lock.on('authenticated', (authResult) => {
debugger; // But I never hit this debugger
let expiresAt = JSON.stringify((authResult.expiresIn * 1000) + new Date().getTime());
sessionStorage.setItem('access_token', authResult.accessToken);
sessionStorage.setItem('id_token', authResult.idToken);
sessionStorage.setItem('expires_at', expiresAt);
});
}
render() {
return(
<AuthContext.Provider value={{ lock: this.lock }}>
{this.props.children}
</AuthContext.Provider>
);
}
}
index.js
以防万一您需要查看它:
import App from './components/App';
import AuthWrapper from './components/auth/AuthWrapper';
// Store
import appStore from './store/app-store';
const store = appStore();
ReactDOM.render(
<Provider store={store}>
<BrowserRouter>
<AuthWrapper>
<App />
</AuthWrapper>
</BrowserRouter>
</Provider>,
document.getElementById('root')
);
解决方案
这是我为完成这项工作所做的更改。
- 我现在初始化
Auth0 Lock
以index.js
使其成为全局 - 我将
onAuthenticated()
侦听器移动到LoginCallback.jsx
成功登录后发送用户的组件。我相信将onAuthenticated()
fromApp.jsx
移到 toLoginCallback.jsx
产生了最大的影响,因为 listener inLoginCallback.jsx
执行 beforeApp.jsx
。 - 成功验证后,我还使用
this.props.history.push('/');
将用户发送到Home
组件
有关完整代码,请参阅https://github.com/imsam67/react-redux-react-router-auth0-lock上的 repo
推荐阅读
- css - HTML tr 用于宽度但隐藏
- python - SyntaxError:使用 ast.parse 扫描字符串文字时 EOL
- python - 使用 python-docx 突出显示 docx 文件中的段落
- c# - MongoDB c# find() 返回 _id 的 objectid 但它是文档中的字符串
- c# - 互斥量从最小化中恢复
- sql - 当我通过日记条目中的 sql 查询导入条目时,余额显示为 00.0。奇多10
- powershell - 10 小时后长时间运行的 Exchange PowerShell 脚本中出现 Kerberos 错误
- c# - BotBuilder-Api C# Dialogs return in previous "ResumeAfter" function
- security - Git-crypt 工作流程 - 部署到多个服务器或 circleci/travisci
- mysql - MySql Workbench,无法连接到“localhost”上的 MySQL 服务器 (10061) (2003)