通过Redux和Redux路由器处理用户身份验证

时间:2015-12-08 15:49:03

标签: javascript authentication cookies react-router redux

我想知道人们通常如何使用redux处理用户身份验证?我正在使用Redux Router,我有一个后端rails API,通过身份验证令牌处理用户身份验证。

当用户提交登录表单时,api将返回auth令牌以用于后续请求。最初我只是将auth令牌存储在单个状态树中,每次我调度需要进行需要用户身份验证的API请求的操作时,我都使用(dispatch,getState)获取该身份验证令牌,然后将其包含在API中请求。所以:getState()。currentUser.auth_token。

我不确定我是否以正确的方式接近这一点。有些人使用localStorage和Redux进行用户身份验证来模拟服务器端会话吗?然后,每次发出API请求时,我只需检查本地存储以获取身份验证令牌,以及用户是否已登录?

我最终做的是使用js-cookies并在用户进行身份验证时执行了Cookie.set。然后,我的根<App />组件有一个componentDidMount,它调度initAuth()操作,该操作检查当前Cookie以查看它是否仍然有效。如果是这样,它会保持用户登录,否则会将身份验证减速器重置为其defaultState。

以下是使用用户身份验证的repo的链接:https://github.com/SpencerCDixon/Kira/blob/master/client/actions/AuthActions.js

非常感谢任何提示或资源。到目前为止,我已经查看了真实世界的示例和React Router auth示例。 React Router示例似乎使用localStorage,这就是为什么我很好奇它是否是正确的路径。我注意到还有一个Redux Localstorage npm包。

我很想知道我是否因意外地打开某种身份验证攻击,或者是否有更好的方法来处理此流程!

2 个答案:

答案 0 :(得分:13)

  

我想知道人们通常如何使用redux处理用户身份验证?

我在这么多项目中处于这种状况,最后我找到了一个解决方案,每次我需要在React / Redux应用程序中处理身份验证时都不会让我感到厌烦。

在我的项目中,我使用的是Node.js,但这并没有改变任何东西,你可以使用任何服务器端技术。

解决方案

我注意到在单页面应用程序(SPA)中,身份验证机制在客户端处理,就像你说的那样,检查用户是否有令牌,用服务器验证它,然后'重定向'到一个基于此的相关路线,现在不管你的SPA是使用React / Redux,Angular,Ember还是Backbone,它都会变得很讨厌。

所以我将身份验证(注册/登录)进程与主应用程序分开,因此当用户第一次启动我的应用程序时,服务器会检查token cookie,如果用户有带有请求的cookie,服务器验证此令牌,如果它是有效的,将客户端重定向到主应用程序页面(例如index.html),如果令牌无效或不存在,服务器会将客户端重定向到登录/注册页面(login.html / signup.html)。

login.html页面不是主应用程序(index.html中的那个)的一部分,事实上,它有一个不同的代码库(更轻,代码少得多,因此可以更快地加载页面)当用户尝试登录时,服务器验证了该login.html页面中的用户名和密码,如果它是有效凭据,则服务器为该用户设置一个token cookie并将其重定向到主应用程序page(index.html),其中可以加载应用程序代码而无需处理身份验证,因为如果用户能够加载此页面(index.html),则意味着他必须拥有有效的令牌。

答案 1 :(得分:1)

我刚刚完成了redux auth开源项目的工作。我正在将令牌存储到localStorage中。对于后端我正在使用节点,但我想你会明白这一点。

https://github.com/DimitriMikadze/node-redux-auth