最近,我正在尝试构建一个带有管理面板的 JWT 身份验证系统,以管理登录用户,以实现简单的目的,例如在移动或网络中使用的 RESTFUL API 或实时数据库(Socket.io)。但是很少有问题这让我绊倒。 现在的状态是我能够使用nodejs创建一个JWT token 并将其传递到前端。 但是之后我不知道如何处理前端的该 token 。这是问题
- 如果我使用 React、Redux 或 ReactNative,是否可以将 token 保存在 Redux 状态,并通过 ajax(Axios) 请求调用它,如果不是应该存储在哪里?
- 如果我只是想使用 HTML 而不是任何类型的单页应用程序框架,我应该在哪里存储 token (本地存储、cookie、窗口 sessionStorage,还有其他什么?)
- 我听说 session 和 cookie 不是存储 token 的好位置,因为它们容易受到不同的攻击,我该如何防止这种情况?
- 这是我遇到的最大问题,我创建了一个表单供用户登录,按下登录按钮后,收到 token 后我将执行一个ajax请求来请求 token ,我应该如何保存 token (根据 q2)并通过设置 header {'x-access-token': token} 将用户重定向到 protected 路由?
- 如果我想允许用户注销,正确的方法是什么? (只是从客户端存储中删除 token ?)
- 我找到了很多关于创建和刷新 token 的教程,但我找不到任何关于获取 token 后该怎么做的教程?有什么好的建议我可以遵循吗?
- 我知道这很奇怪,但我觉得我缺少整个身份验证流程的一些核心概念。有人可以根据我上面提出的问题尝试指出一下吗?
抱歉我的英语不好,我已尽力以正确的方式表达它。
这是我的 github 存储库,用于解决问题 https://github.com/xylops/backend
感谢您花时间阅读本文
最佳答案
存储 token :
使用localStorage
来存储 token ,所以即使用户
刷新页面, token 仍然存在。,您可以添加您的
token 到 axios header
,以便您发出的每个请求都会传递它。
注销用户:
- 是的,只需删除简单应用即可。
- 您应该指定 创建 token 时过期以及用户注销时,存储该 token 数据库中的 token (通常是 Redis)
- 每次用户发出请求时,都会检查 Redis 中是否存储了完全相同的 token ,如果是,则表示这是一个已注销的用户。向用户返回正确的响应。
- 运行一个 cron 作业,该作业将继续从 Redis 中删除过期的 token ,这样您的 Redis 数据库就不会包含过期的 token ,同时您的应用本身将拒绝过期的 token 。
获取Token后
做你想做的事, token 将包含你提供的信息,如用户 ID、姓名和你选择的其他详细信息,基于此你可以在前端显示不同的数据并在后端查找用户特定记录。
您不会错过任何东西,在基于 token 的身份验证中注销并不容易实现,基于 token 的身份验证的优点在于您的应用程序不依赖于 cookie、 session 和您才能真正做出无状态的分布式应用。
<小时/>代码示例
这就是我将 token 与localStorage和Axios一起使用的方式
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 );
}
要解码您可以使用的 token ,JWT
import jwt from 'jsonwebtoken';
const decodedToken = jwt.decode(localStorage.token);
希望这会有所帮助。
关于node.js - 使用nodejs在网页中使用JWT身份验证系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42265015/