我会试图解释与反应,我的路由器高水平采取认证。您需要在服务器和客户端上实施,并且您需要做出一些决策才能使自己成为可能。在这个例子中,我将使用redux作为通量库。
首先,你需要一个机制来保护你的路线,我这样做是有高阶组件,像这样:
// 'Components/requireAuthentication'
import React, { Component, PropTypes } from 'react'
import { connect } from 'react-redux'
import SignIn from './SignIn'
export default (ChildComponent) => {
class AuthenticatedComponent extends Component {
static propTypes = {
hasAuthToken: PropTypes.bool.isRequired
};
render() {
const { hasAuthToken } = this.props
return (hasAuthToken
? <ChildComponent {...this.props} />
: <SignIn />
)
}
}
const mapStateToProps = ({session}) => (session)
return connect(mapStateToProps)(AuthenticatedComponent)
}
这里的代码非常简单,它输出的是需要一个反应组件作为一个功能唯一的论点。这ChildComponent
是你想保护的组件。
hasAuthToken
prop是这里的控件,如果它是真的,那么将会呈现ChildComponent
,否则会呈现SignIn
。请注意,如果您不关心搜索引擎优化,那么呈现SignIn
的这一过程很好,但如果您关心的是搜索引擎将您的受保护路线编入索引,则您可能希望redirect用户登录路线。
最后AuthenticatedComponent
连接到还原存储session
状态,但这可以很容易地切换到使用您选择的任何其他通量库。简而言之,它订阅session
上的更改。如果hasAuthToken
的值发生变化,则组件将在现在挂载时重新呈现。
现在的路线:
import { Route } from 'react-router'
import Container from './Components/Container'
import Private from './Components/Private'
import requireAuthentication from './Components/requireAuthentication'
export default (
<Route path='/' component={Container}>
<Route path='private' component={requireAuthentication(Private)}>
<Route path='other' component={...} />
</Route>
</Route>
)
在这里,我运用requireAuthentication
方法(从上面的代码默认出口法)我要保护的组件。这将防止显示页面,除非redux存储库session.hasAuthToken
属性为true,而是显示SignIn
组件。
嵌套在受保护组件下的其他路由也将受到保护,因为react-router组成路由。
在高级别,SignIn
组件应该简单地是具有正常的<a href>
(即不响应路由器Link
)的页面以开始Oauth2握手。 simple-oauth2模块有一些关于如何实现oauth2服务器端的很好的例子,所以我不会在这里进入。如果您正在关注这些示例,那么您希望将该用户链接到端点app.get('/auth', function (req, res) {})
。
在你将要持续的token
不知何故callback
端点(如您的会话(express-session将帮助在这里),或到数据库),然后将用户重定向回您的应用程序的反应。
现在,您需要将您的会话导入服务器端的REDX存储库,以准备在客户端进行水合。该redux文档解释了如何在Server Rendering页面上执行此操作,特别是Inject Initial Component HTML and State和The Client Side部分。最起码,你需要这样的对象:
{
hasAuthToken: (typeof req.session.token !== 'undefined')
}
当然,你的实际执行情况将完全取决于你如何存储的令牌,并把它提供给服务器端请求。
希望这会让你开始。同样的过程也可以用于其他类型的认证,也可以用服务器作为XHR处理的用户名和密码来替换Oauth2链接。
好运。
!!我看到下面的答案更多的是在Oauth完成后保护路线的方法。我正在构建一个无服务器响应应用程序,我正在处理所有Oauth本身的反应。事实上,在客户端或服务器端处理Oauth是有争议的!我已经在reactJS中处理了谷歌身份验证。但试图验证提供的开发人员(我的意思是自己的身份验证系统,不像socialOauths)。我无法找到任何定制Oauth的反应客户端。我相信戈拉现在会处理它。让我知道我们使用https://github.com/zalando/oauth2-client-js –
You Marc - 是一个冠军 – jit