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

标签 javascript authentication cookies react-router redux

我想知道人们通常如何使用 redux 处理用户身份验证?我正在使用 Redux Router 并且我有一个后端 Rails API,它通过 auth token 处理用户身份验证。

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

我不确定我是否以正确的方式处理这个问题。是否有人将 localStorage 与 Redux 一起用于用户身份验证来模拟服务器端 session ?然后每次发出 API 请求时,我只检查本地存储中的授权 token ,如果它存在,用户是否已登录?

我最终做的是使用 js-cookies 并在用户通过身份验证时执行 Cookie.set。我的根<App /> component 然后有一个 componentDidMount 调度一个 initAuth() Action 来检查当前的 Cookie 以查看它是否仍然有效。如果是这样,它将使用户保持登录状态,否则它将身份验证缩减器重置为其默认状态。

这是带有用户身份验证的存储库链接:https://github.com/SpencerCDixon/Kira/blob/master/client/actions/AuthActions.js

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

很想知道我是否不小心让自己暴露在某种身份验证攻击之下,或者是否有更好的方法来处理此流程!

最佳答案

I was wondering how people normally handle User Authentication with redux?

我在很多项目中都遇到过这种情况,最终我得到了一个解决方案,每次我需要在我的 React/Redux 应用程序中处理身份验证时,它都不会让我大汗淋漓。

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

解决方案

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

所以我将身份验证(注册/登录)过程从主应用程序中分离出来,这样当用户第一次启动我的应用程序时,服务器会检查 token cookie,如果用户在请求中有那个 cookie,服务器验证这个 token ,如果它是有效的,将客户端重定向到主应用程序页面(例如 index.html),如果 token 无效或不存在,服务器重定向客户端到登录/注册页面 (login.html/signup.html)。

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

关于javascript - 通过 Redux 和 Redux 路由器处理用户身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34160157/

相关文章:

javascript - 单击数据标签时添加输入文本框 d3.js

javascript - jQuery - 隐藏所有未选择值的行

javascript悬停动态失败

authentication - Yesod 无 session 认证

javascript - 如何使用 socket.io 设置和读取 cookie?

javascript - 我无法选择正确的 div (使用 Jquery)

java - 使用 Spring Security 登录后无法重定向到不同页面

asp.net-mvc-3 - 授权属性 MVC 3 和 Web.Config AppSettings 值

session - Nuxt Apollo 具有用于基于 session 的身份验证的动态 header

asp.net - 如何使我的 asp.net 网站 "more cookie free"?