JWTauthentication系统使用nodejs在网页上

最近我试图build立一个pipe理面板的JWTauthentication系统来pipe理login用户的简单目的,如RESTFUL API或实时数据库(Socket.io)在移动或web使用。但是有几个问题,过度。 现在的状态是我能够使用nodejs创build一个JWT令牌并将其传递到前端。 但之后,我不知道如何处理前端的令牌。 这里是问题

  1. 如果我正在使用React,Redux或ReactNative,可以将令牌保存在Redux状态,并通过ajax(Axios)请求调用它,如果不是应该在哪里存储?
  2. 如果我只是想使用它而不是任何一种单页应用程序框架的HTML,我应该在哪里存储令牌(本地存储,cookies,窗口sessionStorage,还有什么别的?)
  3. 我听说会话和cookie不是存储令牌的好地方,因为它们容易受到不同的攻击,我怎么能防止呢?
  4. 这是我卡住的最大的一点,我已经创build了一个表单供用户login,按下loginbutton后,我会做一个ajax请求,以获得令牌,收到令牌后,应该如何我保存令牌(根据q2),并通过设置标题{'x-access-token':token}将用户redirect到受保护的路由?
  5. 如果我想让用户注销,那么有什么正确的方法呢? (只需从客户端存储中删除令牌?)
  6. 我发现了很多有关创build和刷新令牌的教程,但我找不到有关获取令牌后应该做什么的任何教程? 有什么好的build议,我可以沿着?
  7. 我知道这很奇怪,但我觉得我错过了整个authenticationstream程中的一些核心概念。 任何人都可以根据我上面提出的问题来指出它吗?

对不起,我的英语不好,我尽我所能用正确的方式说出来。

这是我的github回购的问题https://github.com/xylops/backend

感谢您阅读本文

存储令牌:

使用localStorage存储令牌,所以即使用户刷新页面,令牌仍然存在。,您可以将您的令牌添加到axios header以便它为每个请求传递。

注销用户:

  • 是的只是删除作品简单的应用程序。
  • 您应该在创build令牌时指定到期date,并在用户注销时将该令牌存储在数据库(通常是Redis)
  • 每次用户发出请求时,检查是否在Redis中存储了完全相同的令牌,如果是,则表示这是已注销的用户。将正确的响应返回给用户。
  • 运行一个cron作业,继续从Redis中删除过期的令牌,这样你的redis数据库就不会有过期的令牌,同时你的应用本身也会拒绝过期的令牌。

获得令牌后

做你想做的事,令牌将包含你提供的信息,像用户ID,名字和你select的其他细节。基于此,你可以在前端显示不同的数据,并在后端查找用户特定的logging。

你不会错过任何东西,注册是不容易实现在基于令牌的身份validation,基于令牌的身份validation的美是你的应用程序不依赖于cookie,会话,你可以真正做一个无状态的分布式应用程序。


代码示例

这是我如何使用localStorageAxios令牌

 import axios from 'axios'; const setToken = (token) => { // if token is provided, save it in localStorage and add it to axios header as well. if ( token ) { localStorage.token = token axios.defaults.headers.common['Authorization'] = `Bearer ${token}`; } // if token is empty, just remove it from localStorage and axios.. // set empty token when you logout the user. else { delete localStorage.token; delete axios.defaults.headers.common['Authorization']; } } 

当应用程序第一次加载和每次刷新时都会这样做

 if ( localStorage.token ) { setToken( localStorage.token ); } 

为了解码您可以使用的令牌,JWT

 import jwt from 'jsonwebtoken'; const decodedToken = jwt.decode(localStorage.token); 

希望这有所帮助。